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

chijiaoxian 2008-07-20 04:44:07
大家好:

最近在做一个无线网卡设备,在管理员权限下安装驱动,设备功能一切正常,在这个基础上,转换到非管理员权限下,使用应用程序打开设备,显示获得设备句柄失败。
API部分调用的CreateFile函数返回值为0x0005(ERROR_ACCESS_DENIED)。
请各位大侠给支个招吧,这两天为了这个事情已经弄的焦头烂额了,迫在眉睫,本人在线等。非常感谢!!!
...全文
983 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
fyx010641 2009-08-18
  • 打赏
  • 举报
回复
找到方法了吗?
先在管理员下提升权限,代码如下,我调试过了,肯定行的!


BYTE aclBuffer[1024];
PACL pacl=(PACL)&aclBuffer; //声明一个ACL,长度是1024
BYTE sidBuffer[100];
PSID psid=(PSID) &sidBuffer; //声明一个SID,长度是100
DWORD sidBufferSize = 100;
// char domainBuffer[80];
DWORD domainBufferSize = 80;
// SID_NAME_USE snu;
HANDLE file;
UINT i = 0;
SECURITY_DESCRIPTOR sd; //声明一个SD BYTE aclBuffer[1024];
SECURITY_ATTRIBUTES sa; //和文件有关的安全结构
//初始化一个ACL
//初始化一个SD
HANDLE hAccessToken;
PSID psidAdministrators;
//当获得TOKEN句柄之后,我们还得获取这个TOKEN的分组信息:
BYTE InfoBuffer[1024];
DWORD dwInfoBufferSize;
SID_IDENTIFIER_AUTHORITY siaNtAuthority = SECURITY_NT_AUTHORITY;

//初始化一个SD
InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);

//初始化一个ACL
InitializeAcl(pacl, 1024, ACL_REVISION);


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


BOOL flag = 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_GROUPS ptgGroups = (PTOKEN_GROUPS)InfoBuffer;


InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
InitializeAcl(pacl, 1024, ACL_REVISION);
for( i=0; i<ptgGroups->GroupCount; i++)
{
// if(EqualSid(psidAdministrators, ptgGroups->Groups[i].Sid))
{
// 此进程有管理权限
AddAccessAllowedAce(pacl, ACL_REVISION, GENERIC_ALL, ptgGroups->Groups[i].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;

HANDLE hDevUSB = NULL;
hDevUSB = CreateFile(
lpszFileName,//&guidHID_1,//
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,//FILE_ATTRIBUTE_NORMAL
NULL);




有问题可以和我联系,QQ 99592177 fangyx@wellcom.cn 共同学习!
fyx010641 2009-08-18
  • 打赏
  • 举报
回复
qq
aaazxd 2009-05-11
  • 打赏
  • 举报
回复
请问你找到方法解决了吗?
Treeyan 2008-08-08
  • 打赏
  • 举报
回复
很简单

既然是自己做的驱动,是可以操作的,CreateFile 的时候使用 0 作为操作标志 不要使用任何 GENERIC_XXXX 标志,定义IO_CONTROL_CODE 的时候去掉权限,就OK了。enjoy
dzyssssss 2008-08-06
  • 打赏
  • 举报
回复
顶!应用层是直接打开不了的。
cnzdgs 2008-07-20
  • 打赏
  • 举报
回复
很正常,现在的Windows系统就是不允许非管理员身份的进程直接访问设备。

21,615

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧