根據Vista UAC是否啓用,我需要我的應用程序的行爲有所不同。我的應用程序如何檢測用戶計算機上的UAC狀態?如何檢測Vista UAC是否啓用?
回答
此註冊表項應該告訴你:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
價值EnableLUA (DWORD)
1
啓用/ 0
或丟失禁用
但是,假設你有權閱讀它。
以編程方式,您可以嘗試讀取用戶的令牌並猜測它是否是啓用了UAC的管理員(請參閱here)。不是萬無一失的,但它可能工作。
這裏的問題更多的是「你爲什麼需要知道」 - 它對答案有影響。真的,沒有API是因爲從操作系統行爲的角度來看,重要的是用戶是否是管理員 - 他們如何選擇以管理員身份保護自己是他們的問題。
檢查在HKLM \ SOFTWARE \微軟\ Windows註冊表值\ CurrentVersion \政策\系統
的EnableLUA值確定UAC處於活動狀態。
This post在C#中有示例代碼來測試UAC是否打開以及當前應用程序是否被賦予了提升的權限。您可以下載代碼並根據需要進行解釋。還掛有顯示在C++相同
http://www.itwriting.com/blog/198-c-code-to-detect-uac-elevation-on-vista.html
在該職位代碼不只是從註冊表中讀取一個樣本。如果啓用UAC,則您可能無權從註冊表中讀取該文件。
AFAIK,UAC是本地用戶或組的apolicy設置。所以你可以從.Net中讀取這個屬性。對不起,沒有更多的細節,但我希望這有助於
你可以做到這一點可以檢查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的狀態,但還沒有重新啓動計算機然而,這個函數會返回不一致的結果。
您不想檢查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;
這個職位是比較古老的,但我想上評論的:「你爲什麼需要知道」和「檢查令牌會員」位。
事實是,微軟自己的文檔說「如果用戶帳戶控制已關閉,標準用戶嘗試執行需要提升的任務」,我們應該提供一個錯誤,而不是顯示按鈕和/或鏈接試圖提升的UAC盾牌。詳細信息請參閱http://msdn.microsoft.com/en-us/library/windows/desktop/aa511445.aspx。
我們怎麼做這個而不檢查UAC是否啓用的一種方式?
或許檢查用戶是否具有管理員權限運行是在這種情況下做正確的事情,但誰知道?微軟給出的指導意見是,充其量,前途未卜,如果不只是徹頭徹尾的混亂。
對於其他任何人發現這一點,並正在尋找一個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
- 1. 檢查UAC是否啓用VB6
- 2. Vista的UAC DLL
- 3. 檢測Javascript是否啓用?
- 4. 檢測cors是否啓用?
- 5. 檢測JavaScript是否啓用
- 6. 如何檢測是否通過的ShellExecuteEx推出由UAC
- 7. VB.net禁用UAC win7&Vista?
- 8. 關於UAC在Vista
- 9. 如何以編程方式檢測UAC是否在Windows 8中使用C++啓用?
- 10. .NET - 啓用UAC(Windows7/Vista)時應用程序如何能夠自行更新?
- 11. 這是如何檢測Javascript是否啓用
- 12. iOS 7:檢測App autoupdating是否啓用?
- 13. 檢測mbstring是否啓用PHP腳本
- 14. 爲Windows 7和Vista啓用了UAC的安裝/卸載
- 15. 在Internet Explorer在Vista與UAC調試JavaScript錯誤啓用
- 16. 如何檢測用戶是否啓用了密碼或PIN碼?
- 17. 如何檢測SELinux是否在Android應用程序中啓用?
- 18. 如何檢測我的進程是否正在運行UAC提升?
- 19. 如何檢測可執行文件是否需要UAC提升(C#pref)
- 20. 如何檢測Safari省電模式是否啓用?
- 21. 如何在重啓後檢測Windows服務器是否可用?
- 22. 如何檢測在IE中是否啓用了Java?
- 23. 如何檢測網絡接口的狀態是否已啓用?
- 24. 如何檢測ASP.NET是否在IIS 7中啓用
- 25. 如何檢測防火牆產品是否啓用?
- 26. 如何檢查用戶是否運行Vista或XP
- 27. 如何檢查SeAssignPrimaryTokenPrivilege是否已啓用?
- 28. 如何檢查登錄是否啓用?
- 29. 如何檢查UILabel是否啓用?
- 30. 如何檢查wifi/3g是否啓用?
你能解釋一下你爲什麼需要這個? – 2008-09-18 19:04:38
例如,我有一個應用程序將API用於需要啓用UAC才能工作的外部程序。如果UAC關閉,我想通過對話窗口通知用戶。 – 2008-10-03 17:59:31