我怎样才能提升我的过程在运行时在WIN XP下

我的应用程序需要在运行时进行一些特权操作。 例如,当用户第一次运行我的应用程序时,我必须创build并格式化一个虚拟驱动器。 我使用无证api formatex来完成这个工作,但是需要pipe理员权限。 如果操作系统是Vista或更高版本,我可以提示UAC对话“COM Elevation Moniker”,它工作正常。 但在XP上,这种技术是不适合的,所以我使用模拟方法。 如果应用程序作为有限的用户运行,我这样做:

CredUIPromptForCredentials() -> prompt to get administrator credentials LogonUser() ImpersonateLoggedOnUser() formatex() RevertToSelf() 

formatex仍然失败…当然,以pipe理员身份运行我的应用程序将工作,但它是不好的,我的应用程序安装按用户,而不是每台机器,这应该在当前的用户上下文,即使用户是有限的用户。

我怎样才能在运行时正确提升我的应用程序来完成格式化工作? 任何一个帮助?

Solutions Collecting From Web of "我怎样才能提升我的过程在运行时在WIN XP下"

一个可能的解决方案是重新执行应用程序提升特权和一些命令行参数,将指示执行实际的格式。

示例代码:

 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; }