设备在非管理员权限下无法打开,createfile返回值为(0x0005)

[复制链接]
查看11 | 回复6 | 2021-1-27 07:16:57 | 显示全部楼层 |阅读模式
大家好:
最近在做一个无线网卡设备,在管理员权限下安装驱动,设备功能一切正常,在这个基础上,转换到非管理员权限下,使用应用程序打开设备,显示获得设备句柄失败。
API部分调用的CreateFile函数返回值为0x0005(ERROR_ACCESS_DENIED)。
请各位大侠给支个招吧,这两天为了这个事情已经弄的焦头烂额了,迫在眉睫,本人在线等。非常感谢!!!

分 -->
回复

使用道具 举报

千问 | 2021-1-27 07:16:57 | 显示全部楼层
很正常,现在的Windows系统就是不允许非管理员身份的进程直接访问设备。
回复

使用道具 举报

千问 | 2021-1-27 07:16:57 | 显示全部楼层
顶!应用层是直接打开不了的。
回复

使用道具 举报

千问 | 2021-1-27 07:16:57 | 显示全部楼层
很简单
既然是自己做的驱动,是可以操作的,CreateFile的时候使用0作为操作标志不要使用任何GENERIC_XXXX标志,定义IO_CONTROL_CODE的时候去掉权限,就OK了。enjoy
回复

使用道具 举报

千问 | 2021-1-27 07:16:57 | 显示全部楼层
请问你找到方法解决了吗?
回复

使用道具 举报

千问 | 2021-1-27 07:16:57 | 显示全部楼层
qq
回复

使用道具 举报

千问 | 2021-1-27 07:16:57 | 显示全部楼层
找到方法了吗?
先在管理员下提升权限,代码如下,我调试过了,肯定行的!

BYTEaclBuffer[1024];
PACLpacl=(PACL)&aclBuffer;//声明一个ACL,长度是1024
BYTEsidBuffer[100];
PSIDpsid=(PSID)&sidBuffer;//声明一个SID,长度是100
DWORDsidBufferSize=100;
//chardomainBuffer[80];
DWORDdomainBufferSize=80;
//SID_NAME_USEsnu;
HANDLEfile;
UINTi=0;
SECURITY_DESCRIPTORsd;//声明一个SDBYTEaclBuffer[1024];
SECURITY_ATTRIBUTESsa;//和文件有关的安全结构
//初始化一个ACL
//初始化一个SD
HANDLEhAccessToken;
PSIDpsidAdministrators;
//当获得TOKEN句柄之后,我们还得获取这个TOKEN的分组信息:
BYTEInfoBuffer[1024];
DWORDdwInfoBufferSize;
SID_IDENTIFIER_AUTHORITYsiaNtAuthority=SECURITY_NT_AUTHORITY;
//初始化一个SD
InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION);
//初始化一个ACL
InitializeAcl(pacl,1024,ACL_REVISION);

//查找一个用户hchen,并取该用户的SID
OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY,&hAccessToken);

BOOLflag=GetTokenInformation(
hAccessToken,
TokenGroups,
InfoBuffer,
1024,
&dwInfoBufferSize);
AllocateAndInitializeSid(
&siaNtAuthority,
2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0,0,0,0,0,0,
&psidAdministrators);

PTOKEN_GROUPSptgGroups=(PTOKEN_GROUPS)InfoBuffer;

InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION);
InitializeAcl(pacl,1024,ACL_REVISION);
for(i=0;iGroupCount;i++)
{
//if(EqualSid(psidAdministrators,ptgGroups->Groups.Sid))
{
//此进程有管理权限
AddAccessAllowedAce(pacl,ACL_REVISION,GENERIC_ALL,ptgGroups->Groups.Sid);
//break;
}
}

//设置该用户的Access-Allowed的ACE,其权限为“所有权限”
AddAccessAllowedAce(pacl,ACL_REVISION,GENERIC_ALL,psid);
//把ACL设置到SD中
SetSecurityDescriptorDacl(&sd,TRUE,pacl,FALSE);
//把SD放到文件安全结构SA中
sa.nLength=sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle=FALSE;
sa.lpSecurityDescriptor=&sd;
HANDLEhDevUSB=NULL;
hDevUSB=CreateFile(
lpszFileName,//&guidHID_1,//
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,//FILE_ATTRIBUTE_NORMAL
NULL);


有问题可以和我联系,[email protected]共同学习!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行