2008-09-18 90 views
22

根據Vista UAC是否啓用,我需要我的應用程序的行爲有所不同。我的應用程序如何檢測用戶計算機上的UAC狀態?如何檢測Vista UAC是否啓用?

+0

你能解釋一下你爲什麼需要這個? – 2008-09-18 19:04:38

+2

例如,我有一個應用程序將API用於需要啓用UAC才能工作的外部程序。如果UAC關閉,我想通過對話窗口通知用戶。 – 2008-10-03 17:59:31

回答

18

此註冊表項應該告訴你:

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System 

價值EnableLUA (DWORD)

1啓用/ 0或丟失禁用

但是,假設你有權閱讀它。

以編程方式,您可以嘗試讀取用戶的令牌並猜測它是否是啓用了UAC的管理員(請參閱here)。不是萬無一失的,但它可能工作。

這裏的問題更多的是「你爲什麼需要知道」 - 它對答案有影響。真的,沒有API是因爲從操作系統行爲的角度來看,重要的是用戶是否是管理員 - 他們如何選擇以管理員身份保護自己是他們的問題。

2

檢查在HKLM \ SOFTWARE \微軟\ Windows註冊表值\ CurrentVersion \政策\系統

的EnableLUA值確定UAC處於活動狀態。

-1

AFAIK,UAC是本地用戶或組的apolicy設置。所以你可以從.Net中讀取這個屬性。對不起,沒有更多的細節,但我希望這有助於

3

你可以做到這一點可以檢查DWORD值EnableLUA在以下注冊表項:

HKLM/SOFTWARE /微軟/視窗/ CURRENTVERSION /策略/系統

如果該值爲0(或不存在),那麼UAC是關閉的。如果它的存在,並且不爲零,那麼UAC爲ON:

BOOL IsUacEnabled() 
{ 
    LPCTSTR pszSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System"); 
    LPCTSTR pszValue = _T("EnableLUA"); 
    DWORD dwType = 0; 
    DWORD dwValue = 0; 
    DWORD dwValueSize = sizeof(DWORD); 

    if (ERROR_SUCCESS != SHGetValue(HKEY_LOCAL_MACHINE, pszSubKey, pszValueOn, 
     &dwType, &dwValue, &dwValueSize)) 
    { 
      return FALSE; 
    } 

    return dwValue != 0; 
} 

請注意,如果用戶已經改變了UAC的狀態,但還沒有重新啓動計算機然而,這個函數會返回不一致的結果。

4

您不想檢查UAC是否已啓用;那不會告訴你任何事情。

我可以成爲禁用UAC的標準用戶。

您要檢查if the user is running with administrative privileges using CheckTokenMembership

///This function tells us if we're running with administrative permissions. 
function IsUserAdmin: Boolean; 
var 
    b: BOOL; 
    AdministratorsGroup: PSID; 
begin 
    { 
     This function returns true if you are currently running with 
       admin privileges. 
     In Vista and later, if you are non-elevated, this function will 
       return false (you are not running with administrative privileges). 
     If you *are* running elevated, then IsUserAdmin will return 
       true, as you are running with admin privileges. 

     Windows provides this similar function in Shell32.IsUserAnAdmin. 
       But the function is depricated, and this code is lifted from the 
       docs for CheckTokenMembership: 
       http://msdn.microsoft.com/en-us/library/aa376389.aspx 
    } 

    { 
     Routine Description: This routine returns TRUE if the caller's 
     process is a member of the Administrators local group. Caller is NOT 
     expected to be impersonating anyone and is expected to be able to 
     open its own process and process token. 
     Arguments: None. 
     Return Value: 
      TRUE - Caller has Administrators local group. 
      FALSE - Caller does not have Administrators local group. 
    } 
    b := AllocateAndInitializeSid(
      SECURITY_NT_AUTHORITY, 
      2, //2 sub-authorities 
      SECURITY_BUILTIN_DOMAIN_RID, //sub-authority 0 
      DOMAIN_ALIAS_RID_ADMINS,  //sub-authority 1 
      0, 0, 0, 0, 0, 0,    //sub-authorities 2-7 not passed 
      AdministratorsGroup); 
    if (b) then 
    begin 
     if not CheckTokenMembership(0, AdministratorsGroup, b) then 
     b := False; 
     FreeSid(AdministratorsGroup); 
    end; 

    Result := b; 
end; 
1

這個職位是比較古老的,但我想上評論的:「你爲什麼需要知道」和「檢查令牌會員」位。

事實是,微軟自己的文檔說「如果用戶帳戶控制已關閉,標準用戶嘗試執行需要提升的任務」,我們應該提供一個錯誤,而不是顯示按鈕和/或鏈接試圖提升的UAC盾牌。詳細信息請參閱http://msdn.microsoft.com/en-us/library/windows/desktop/aa511445.aspx

我們怎麼做這個而不檢查UAC是否啓用的一種方式?

或許檢查用戶是否具有管理員權限運行是在這種情況下做正確的事情,但誰知道?微軟給出的指導意見是,充其量,前途未卜,如果不只是徹頭徹尾的混亂。

1

對於其他任何人發現這一點,並正在尋找一個VBScript的解決方案。這是我想出來檢測UAC是否啓用,如果是這樣,重新啓動我的腳本與提升的權限。把你的代碼放在Body()函數中。我發現XP和Windows 7之間的可移植性存在問題,如果我編寫代碼來始終啓動提升。如果沒有UAC,則使用此方法繞過高程。還應該考慮到啓用了UAC的2008和更高版本的服務器版本。

On Error Resume Next 
UACPath = "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\EnableLUA" 
Dim WshShell 
Set WshShell = CreateObject("wscript.Shell") 
UACValue = WshShell.RegRead(UACPath) 
If UACValue = 1 Then 
'Run Elevated 
    If WScript.Arguments.length =0 Then 
     Set objShell = CreateObject("Shell.Application") 
     'Pass a bogus argument with leading blank space, say [ uac] 
     objShell.ShellExecute "wscript.exe", Chr(34) & _ 
     WScript.ScriptFullName & Chr(34) & " uac", "", "runas", 1 
     WScript.Quit 
    Else 
     Body() 
    End If 
Else 
Body() 
End If 

Function Body() 
MsgBox "This is the body of the script" 
End Function 
相關問題