2011-12-30 55 views
2

我的應用程序需要在運行時執行一些特權操作。例如,當用戶第一次運行我的應用程序時,我必須創建並格式化虛擬驅動器。我使用無證api formatex來完成fomating工作,但是formatex需要管理員權限。如果操作系統是Vista或更高版本,我可以用'COM Elevation Moniker'提示UAC對話框,它工作正常。但在XP上,這種技術不適合,所以我使用模擬方法。 如果應用程序運行所限制的用戶,我在格式化是這樣的:我如何在運行時在運行時提升我的進程win xp

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

formatex仍然失敗...... 當然,運行我的應用程序作爲管理員的作品,但它是不好的,是安裝我的應用程序根據用戶而不是每臺機器,即使用戶是受限用戶,也應該在當前用戶環境下工作。

如何在運行時正確提升我的應用程序以執行格式化作業?任何一個幫助?

回答

2

一個可能的解決方案是用提升的權限和一些命令行參數來重新執行應用程序,這些命令行參數將指示執行實際的格式化。

示例代碼:

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

這是我在我的應用程序做(不IsUserAdmin()檢查,雖然 - 我讓Win32 API函數報告'ERROR_ELEVATION_NEEDED'我代替),以及它的工作原理很好。 – 2011-12-30 18:59:42

+0

感謝dimitri的回答。我最終使用dimitri提出的方法,但有點不同。我使用CredUIPromptForCredentials() - > LogonUser() - > IsUserAdmin(我的功能) - > CreateProcessWithLogonW循環來確保管理員憑證。現在一切順利。 – toki 2012-01-04 07:44:23

相關問題