我如何在运行时在运行时提升我的进程win xp
问题描述:
我的应用程序需要在运行时执行一些特权操作。例如,当用户第一次运行我的应用程序时,我必须创建并格式化虚拟驱动器。我使用无证api formatex来完成fomating工作,但是formatex需要管理员权限。如果操作系统是Vista或更高版本,我可以用'COM Elevation Moniker'提示UAC对话框,它工作正常。但在XP上,这种技术不适合,所以我使用模拟方法。 如果应用程序运行所限制的用户,我在格式化是这样的:我如何在运行时在运行时提升我的进程win xp
CredUIPromptForCredentials() -> prompt to get administrator credentials
LogonUser()
ImpersonateLoggedOnUser()
formatex()
RevertToSelf()
formatex仍然失败...... 当然,运行我的应用程序作为管理员的作品,但它是不好的,是安装我的应用程序根据用户而不是每台机器,即使用户是受限用户,也应该在当前用户环境下工作。
如何在运行时正确提升我的应用程序以执行格式化作业?任何一个帮助?
答
一个可能的解决方案是用提升的权限和一些命令行参数来重新执行应用程序,这些命令行参数将指示执行实际的格式化。
示例代码:
if (!IsUserAdmin()) {
RunAsAdmin(hwnd, exeName, "--do-format");
} else {
DoFormat();
}
...
BOOL RunAsAdmin(HWND hWnd, LPCTSTR lpFile, LPCTSTR lpParameters)
{
SHELLEXECUTEINFO sei;
ZeroMemory(&sei, sizeof(sei));
sei.cbSize = sizeof(SHELLEXECUTEINFOW);
sei.hwnd = hWnd;
sei.fMask = SEE_MASK_FLAG_DDEWAIT | SEE_MASK_FLAG_NO_UI;
sei.lpVerb = _TEXT("runas");
sei.lpFile = lpFile;
sei.lpParameters = lpParameters;
sei.nShow = SW_SHOWNORMAL;
if (!ShellExecuteEx(&sei)) {
return FALSE;
}
return TRUE;
}
BOOL IsUserAdmin(VOID)
{
BOOL b;
SID_IDENTIFIER_AUTHORITY NtAuthority = { SECURITY_NT_AUTHORITY };
PSID AdministratorsGroup;
b = AllocateAndInitializeSid(
&NtAuthority,
2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0,
&AdministratorsGroup);
if (b) {
if (!CheckTokenMembership(NULL, AdministratorsGroup, &b)) {
b = FALSE;
}
FreeSid(AdministratorsGroup);
}
return b;
}
这是我在我的应用程序做(不IsUserAdmin()检查,虽然 - 我让Win32 API函数报告'ERROR_ELEVATION_NEEDED'我代替),以及它的工作原理很好。 – 2011-12-30 18:59:42
感谢dimitri的回答。我最终使用dimitri提出的方法,但有点不同。我使用CredUIPromptForCredentials() - > LogonUser() - > IsUserAdmin(我的功能) - > CreateProcessWithLogonW循环来确保管理员凭证。现在一切顺利。 – toki 2012-01-04 07:44:23