Pergunta

Eu preciso da minha candidatura a se comportar de maneira diferente, dependendo se Vista UAC é habilitado ou não. Como pode o meu aplicativo detectar o estado de UAC no computador do usuário?

Foi útil?

Solução

Esta chave de registo deve dizer-lhe:

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

Valor EnableLUA (DWORD)

1 habilitado / 0 ou faltando com deficiência

Mas isso pressupõe que você tenha o direito de lê-lo.

programaticamente você pode tentar ler o usuário do token e acho que se é um administrador correndo com UAC ativado (veja aqui ). Não é infalível, mas pode funcionar.

A questão aqui é mais um "por que você precisa saber" - que tem influência sobre a resposta. Realmente, não há nenhuma API porque a partir de um ponto de comportamento OS de vista, o que importa é se o usuário é um administrador ou não - como eles escolhem para se proteger como admin é o seu problema.

Outras dicas

Este post tem código de exemplo em C # para testar se o UAC está ligado e se o aplicativo atual foi dada direitos elevados. Você pode baixar o código e interpretar conforme necessário. Também ligado não é um exemplo que mostra a mesma em C ++

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

O código nesse post não apenas ler a partir do registro. Se o UAC estiver habilitado, as chances são que você não pode ter direitos para ler que a partir do registro.

Você não quer verificar se o UAC está habilitado; que não lhe diz nada.

Eu posso ser um usuário padrão com o UAC desativado.

Você quer verificar se o usuário está sendo executado com privilégios administrativos usando 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;

Você pode fazê-lo ser examinando o valor DWORD EnableLUA na seguinte chave do registro:

HKLM / Software / Microsoft / Windows / CurrentVersion / Política / Sistema

Se o valor for 0 (ou não existe), então o UAC é OFF. Se ele está presente e não-zero, em seguida, 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;
} 

Note que, se o usuário alterou o estado de UAC, mas não ter reiniciado o computador, no entanto, esta função irá retornar um resultado incoerente.

Verifique se o valor do Registro em HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Policies \ System

O valor EnableLUA determina se o UAC está ativo.

Este post é bastante antiga, mas eu queria comentário sobre o "por que você precisa saber" e "check adesão simbólicos" bits.

O fato é que muito própria documentação da Microsoft diz que "Se o Controle de Conta de Usuário foi desligado e uma tentativa de usuário padrão para executar uma tarefa que requer elevação" devemos fornecer um erro em vez de mostrar botões e / ou ligações com o UAC escudo que elevação tentativa. Consulte http://msdn.microsoft.com/en-us/ biblioteca / janelas / desktop / aa511445.aspx para o fundo para os detalhes.

Como é que vamos fazer para isso sem uma forma de verificar se o UAC está habilitado?

Talvez verificar se o usuário está sendo executado com privilégios de administrador é a coisa certa a fazer neste caso, mas quem sabe? A orientação que a Microsoft dá é, na melhor das hipóteses , duvidoso, se não apenas totalmente confusa.

Para qualquer outra pessoa que acha isso e está à procura de uma solução VBScript. Aqui está o que eu vim com para detectar se o UAC está habilitado e se assim relançar o meu script com privilégios elevados. Basta colocar o seu código na função corporal (). Descobri que havia problemas com transportabilidade entre XP e Windows 7 se eu escrevi código para sempre lançam elevada. Usando este método que eu desvio a elevação, se não houver UAC. Deve também ter em conta 2008 e acima das versões de servidor que possuem UAC habilitado.

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, o UAC é apolicy configuração no local usuário ou grupo. Então você pode ler esta propriedade a partir de dentro .Net. Desculpe por não ter mais detalhes, mas eu espero que isso ajude

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top