5719|6

91

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

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

大家好:

最近在做一个无线网卡设备,在管理员权限下安装驱动,设备功能一切正常,在这个基础上,转换到非管理员权限下,使用应用程序打开设备,显示获得设备句柄失败。
API部分调用的CreateFile函数返回值为0x0005(ERROR_ACCESS_DENIED)。
请各位大侠给支个招吧,这两天为了这个事情已经弄的焦头烂额了,迫在眉睫,本人在线等。非常感谢!!!

最新回复

找到方法了吗? 先在管理员下提升权限,代码如下,我调试过了,肯定行的!         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; 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;                 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   共同学习!  详情 回复 发表于 2009-8-18 13:15
点赞 关注

回复
举报

99

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
很正常,现在的Windows系统就是不允许非管理员身份的进程直接访问设备。
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
顶!应用层是直接打开不了的。
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

4
 
很简单

既然是自己做的驱动,是可以操作的,CreateFile 的时候使用 0 作为操作标志 不要使用任何 GENERIC_XXXX 标志,定义IO_CONTROL_CODE 的时候去掉权限,就OK了。enjoy
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

5
 
请问你找到方法解决了吗?
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

6
 
qq
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

7
 
找到方法了吗?
先在管理员下提升权限,代码如下,我调试过了,肯定行的!


        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; 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;
       
        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   共同学习!
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表