Vista UAC가 활성화되어 있는지 확인하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/95510

  •  01-07-2019
  •  | 
  •  

문제

Vista UAC 활성화 여부에 따라 내 응용 프로그램이 다르게 작동하도록 해야 합니다.내 애플리케이션이 사용자 컴퓨터의 UAC 상태를 어떻게 감지할 수 있나요?

도움이 되었습니까?

해결책

이 레지스트리 키는 다음을 알려줍니다.

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

EnableLUA (DWORD)

1 활성화 / 0 또는 누락된 장애인

그러나 그것은 당신이 그것을 읽을 권리가 있다고 가정합니다.

프로그래밍 방식으로 사용자의 토큰을 읽고 UAC가 활성화된 상태에서 실행 중인 관리자인지 추측할 수 있습니다(참조: 여기).완벽하지는 않지만 작동할 수 있습니다.

여기서 문제는 "왜 알아야 하는가"에 더 가깝습니다. 이는 답변과 관련이 있습니다.실제로 OS 동작 관점에서 볼 때 중요한 것은 사용자가 관리자인지 아닌지입니다. 즉, 관리자로서 자신을 보호하기로 선택한 방법이 문제이기 때문에 API가 없습니다.

다른 팁

이 게시물 UAC가 켜져 있는지, 그리고 현재 앱에 높은 권한이 부여되었는지 테스트하기 위한 C# 샘플 코드가 있습니다.코드를 다운로드하고 필요에 따라 해석할 수 있습니다.또한 C++에서 동일한 내용을 보여주는 샘플이 링크되어 있습니다.

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

해당 게시물의 코드는 단지 레지스트리에서 읽는 것이 아닙니다.UAC가 활성화된 경우 레지스트리에서 UAC를 읽을 수 있는 권한이 없을 가능성이 있습니다.

UAC가 활성화되어 있는지 확인하고 싶지 않습니다.그것은 당신에게 아무것도 말하지 않습니다.

UAC가 비활성화된 표준 사용자가 될 수 있습니다.

확인하고 싶으신가요? 사용자가 다음을 사용하여 관리 권한으로 실행 중인 경우 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;

DWORD 값을 검사하여 수행할 수 있습니다. 루아 활성화 다음 레지스트리 키에:

HKLM/소프트웨어/Microsoft/Windows/CurrentVersion/정책/시스템

값이 0(또는 존재하지 않는 경우)이면 UAC가 꺼진 것입니다.존재하고 0이 아닌 경우 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 상태를 변경했지만 아직 컴퓨터를 다시 시작하지 않은 경우 이 함수는 일관되지 않은 결과를 반환합니다.

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System에서 레지스트리 값을 확인하세요.

EnableLUA 값은 UAC가 활성화되어 있는지 여부를 결정합니다.

이 게시물은 다소 오래된 게시물이지만 "왜 알아야 합니까?" 및 "토큰 멤버십 확인" 부분에 대해 언급하고 싶었습니다.

사실 Microsoft 자체 문서에는 "사용자 계정 컨트롤이 꺼져 있고 표준 사용자가 권한 상승이 필요한 작업을 수행하려고 시도하는 경우" UAC 방패가 있는 버튼 및/또는 링크를 표시하는 대신 오류를 제공해야 한다고 명시되어 있습니다. 상승을 시도합니다.보다 http://msdn.microsoft.com/en-us/library/windows/desktop/aa511445.aspx 자세한 내용은 하단을 참조하세요.

UAC가 활성화되어 있는지 확인하지 않고 어떻게 이를 수행할 수 있나요?

아마도 이 경우 사용자가 관리자 권한으로 실행 중인지 확인하는 것이 올바른 일이지만 누가 알겠습니까?Microsoft가 제공하는 지침은 다음과 같습니다. 기껏해야, iffy, 완전히 혼란스러운 것은 아니더라도.

이것을 발견하고 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

AFAIK, UAC는 로컬 사용자 또는 그룹에 대한 정책 설정입니다.따라서 .Net 내에서 이 속성을 읽을 수 있습니다.자세한 내용이 없어서 죄송하지만 도움이 되었으면 좋겠습니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top