2008-09-18 40 views
22

Tôi cần ứng dụng của mình hoạt động khác nhau tùy thuộc vào việc liệu Vista UAC có được bật hay không. Làm thế nào ứng dụng của tôi có thể phát hiện trạng thái UAC trên máy tính của người dùng?Cách phát hiện xem Vista UAC có được bật không?

+0

Bạn có thể giải thích lý do bạn cần điều này không? –

+2

Ví dụ, tôi có một ứng dụng sử dụng API cho một chương trình bên ngoài yêu cầu UAC được bật để hoạt động. Nếu UAC bị tắt, tôi muốn thông báo cho người dùng bằng cửa sổ hộp thoại. –

Trả lời

18

khóa registry này nên nói với bạn:

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

Value EnableLUA (DWORD)

1 bật/0 hoặc mất tích tàn tật

Nhưng mà giả sử bạn có quyền đọc nó.

Lập trình bạn có thể thử đọc mã thông báo của người dùng và đoán xem có phải là quản trị viên đang chạy với UAC được bật hay không (xem here). Không dễ dàng, nhưng nó có thể hoạt động.

Vấn đề ở đây là nhiều hơn về "tại sao bạn cần phải biết" - nó mang về câu trả lời. Thực sự, không có API vì từ quan điểm về hành vi của hệ điều hành, điều quan trọng là nếu người dùng là quản trị viên hay không - cách họ chọn tự bảo vệ mình là quản trị viên là vấn đề của họ.

+0

Đây là điểm bắt 22. Nếu UAC được bật, rất có thể bạn sẽ không có quyền đọc nó. –

+0

Chỉnh sửa nhỏ: khoá đăng ký là HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Policies \ System và EnableLUA là giá trị DWORD (nó không phải là khóa). HTH –

+0

Bạn nên sử dụng! = 0 và không so sánh với 1 theo nguồn google chrome (Rõ ràng một số hệ thống có> 1 giá trị) – Anders

2

Kiểm tra giá trị đăng ký tại HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Policies \ System

Giá trị EnableLUA xác định nếu UAC được kích hoạt.

4

This post có mã mẫu trong C# để kiểm tra xem UAC đã bật chưa và liệu ứng dụng hiện có đã được cấp quyền hay chưa. Bạn có thể tải xuống mã và diễn giải khi cần. Cũng liên quan có một mẫu cho thấy tương tự trong C++

http://www.itwriting.com/blog/198-c-code-to-detect-uac-elevation-on-vista.html

Các mã trong bài điều đó không chỉ đọc từ registry. Nếu UAC được kích hoạt, rất có thể là bạn có thể không có quyền đọc nó từ sổ đăng ký.

-1

AFAIK, UAC là cài đặt apolicy trên người dùng hoặc nhóm cục bộ. Vì vậy, bạn có thể đọc thuộc tính này từ bên trong .Net. Xin lỗi vì không có nhiều chi tiết nhưng tôi hy vọng điều này sẽ giúp

3

Bạn có thể làm điều đó được kiểm tra các giá trị DWORD EnableLUA trong khóa registry sau đây:

HKLM/SOFTWARE/Microsoft/Windows/CurrentVersion/Policies/System

Nếu giá trị là 0 (hoặc không tồn tại) thì UAC là OFF. Nếu đó là hiện tại và khác không, sau đó UAC là 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; 
} 

Lưu ý rằng nếu người dùng đã thay đổi trạng thái của UAC nhưng chưa khởi động lại máy tính nào, chức năng này sẽ trả về một kết quả không phù hợp.

4

Bạn không muốn kiểm tra xem UAC có được bật hay không; điều đó không cho bạn biết điều gì.

Tôi có thể là người dùng chuẩn bị tắt UAC.

Bạn muốn kiểm tra 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

bài này khá cổ, nhưng tôi muốn bình luận về "tại sao bạn cần phải biết" và "kiểm tra thẻ thành viên" bit. Thực tế là tài liệu rất riêng của Microsoft nói rằng "Nếu điều khiển tài khoản người dùng bị tắt và người dùng chuẩn thực hiện nhiệm vụ yêu cầu nâng cao", chúng tôi sẽ cung cấp lỗi thay vì hiển thị các nút và/hoặc liên kết lá chắn UAC cố gắng nâng cao. Xem http://msdn.microsoft.com/en-us/library/windows/desktop/aa511445.aspx về phía dưới để biết chi tiết.

Làm cách nào để thực hiện điều này mà không có cách kiểm tra xem UAC có được bật không?

Có lẽ kiểm tra xem người dùng có đang chạy với đặc quyền quản trị hay không là điều đúng đắn cần làm trong trường hợp này, nhưng ai biết được? Hướng dẫn mà Microsoft đưa ra là, ở mức tốt nhất, tức là, nếu không hoàn toàn khó hiểu.

1

Đối với bất kỳ ai khác tìm thấy điều này và đang tìm kiếm giải pháp VBScript. Đây là những gì tôi đã đưa ra để phát hiện nếu UAC được kích hoạt và nếu như vậy khởi chạy lại kịch bản của tôi với đặc quyền nâng cao. Chỉ cần đặt mã của bạn vào hàm Body(). Tôi thấy có vấn đề với khả năng vận chuyển giữa XP và Windows 7 nếu tôi viết mã để luôn khởi động cao. Sử dụng phương pháp này tôi bỏ qua độ cao nếu không có UAC. Cũng nên tính đến các phiên bản máy chủ năm 2008 trở lên đã bật UAC.

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 
Các vấn đề liên quan