同事在测试工具在Vista下运行的时候,无意中发现工具报了一个调用"msflxgrd.ocx"出错。因为ocx是控件,如果在运行前不注册的话,有可能该控件无法使用。于是我在Vista上尝试手工注册之(“regsvr32 msflxgrd.ocx”),结果报错。根据错误代码在网上查到的原因是,没有权限。
那么很明显是因为我登陆的帐户没有管理员权限。看来Vista系统在用户权限上比以前的操作系统严格许多,也许是应对外界安全性质疑的一种解决措施吧。查看工具代码后得知,代码中有注册该控件的部分,应该是代码执行注册时因权限不够而失败导致的问难题。当我用管理员身份运行工具是,一切OK。这证明了我的理论是正确的。问题很清楚了,因为我们平时在开发软件的时候,总是假想安装着和使用者都是以管理员身份来使用的,所以代码中并没有考虑执行权限的问题。当软件没有涉及需要极高权限操作时,一切平安无事。如果涉及到这种需要注册控件的高级权限问题时,而使用者又恰好没有管理员权限,那么问题就暴露出来了。
为了解决这个问题,我在网上查到一段可以提升执行权限的代码。经测试,在Vista32位系统下是有效的。
各API的含义可以参看MSDN的解释,在此就不多说明了。
那么很明显是因为我登陆的帐户没有管理员权限。看来Vista系统在用户权限上比以前的操作系统严格许多,也许是应对外界安全性质疑的一种解决措施吧。查看工具代码后得知,代码中有注册该控件的部分,应该是代码执行注册时因权限不够而失败导致的问难题。当我用管理员身份运行工具是,一切OK。这证明了我的理论是正确的。问题很清楚了,因为我们平时在开发软件的时候,总是假想安装着和使用者都是以管理员身份来使用的,所以代码中并没有考虑执行权限的问题。当软件没有涉及需要极高权限操作时,一切平安无事。如果涉及到这种需要注册控件的高级权限问题时,而使用者又恰好没有管理员权限,那么问题就暴露出来了。
为了解决这个问题,我在网上查到一段可以提升执行权限的代码。经测试,在Vista32位系统下是有效的。
- void RaisePrivleges()
- {
- HANDLE hToken;
- TOKEN_PRIVILEGES tkp;
- tkp.PrivilegeCount = 1;
- tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
- if(OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken))
- {
- if(LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid))
- {
- AdjustTokenPrivileges(hToken, FALSE &tkp, 0x10, (PTOKEN_PRIVILEGES)NULL, 0);
- }
- }
- if (hToken) CloseHandle(hToken);
- }