Question

J'ai besoin que mon application se comporte différemment selon que Vista UAC est activé ou non. Comment mon application peut-elle détecter l'état du contrôle de compte d'utilisateur sur l'ordinateur de l'utilisateur?

Était-ce utile?

La solution

Cette clé de registre devrait vous indiquer:

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

Valeur EnableLUA (DWORD)

1 activé / 0 ou désactivé désactivé

Mais cela suppose que vous avez le droit de le lire.

Par programme, vous pouvez essayer de lire le jeton de l'utilisateur et deviner s'il s'agit d'un administrateur fonctionnant avec le contrôle de compte d'utilisateur activé (voir ici ). Pas infaillible, mais ça peut marcher.

Le problème ici est plutôt de savoir "pourquoi avez-vous besoin de savoir"? - cela a une incidence sur la réponse. En réalité, il n’existe pas d’API car, du point de vue du comportement du système d’exploitation, l’important est que l’utilisateur soit administrateur ou non - la façon dont ils choisissent de se protéger en tant qu’administrateur est leur problème.

Autres conseils

Cet article a un exemple de code en C # pour vérifier si le contrôle de compte d'utilisateur est activé et si l'application actuelle a reçu des droits élevés. Vous pouvez télécharger le code et interpréter au besoin. Également lié, il y a un exemple qui montre la même chose en C ++

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

Le code de cette publication ne se limite pas à la lecture du registre. Si le contrôle de compte d'utilisateur est activé, il est possible que vous n'ayez pas le droit de le lire dans le registre.

Vous ne voulez pas vérifier si le contrôle de compte d'utilisateur est activé; cela ne vous dit rien.

Je peux être un utilisateur standard avec le contrôle de compte d'utilisateur désactivé.

Vous souhaitez vérifier si l'utilisateur exécute des privilèges d'administration à l'aide de 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;

Vous pouvez le faire en examinant la valeur DWORD EnableLUA dans la clé de registre suivante:

HKLM / LOGICIEL / Microsoft / Windows / CurrentVersion / Stratégies / Système

Si la valeur est 0 (ou n'existe pas), le contrôle de compte d'utilisateur est désactivé. S'il est présent et différent de zéro, le contrôle de compte d'utilisateur est activé:

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;
} 

Notez que si l'utilisateur a modifié l'état de l'UAC mais n'a pas encore redémarré l'ordinateur, cette fonction renvoie un résultat incohérent.

Recherchez la valeur de registre dans HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Policies \ System

La valeur EnableLUA détermine si le contrôle de compte d'utilisateur est actif.

Ce message est plutôt ancien, mais je voulais commenter le "pourquoi avez-vous besoin de savoir"? et "vérifier l'appartenance au jeton" bits.

Le fait est que la propre documentation de Microsoft indique que "Si le contrôle de compte d'utilisateur a été désactivé et qu'un utilisateur standard tente d'exécuter une tâche nécessitant une élévation" nous devrions fournir une erreur au lieu d'afficher des boutons et / ou des liens avec le bouclier UAC qui tentent d'élévation. Voir http://msdn.microsoft.com/en-us/ bibliothèque / windows / desktop / aa511445.aspx vers le bas pour plus de détails.

Comment y parvenons-nous sans moyen de vérifier si le contrôle de compte d'utilisateur est activé?

Peut-être que vérifier si l'utilisateur fonctionne avec des privilèges d'administrateur est la bonne chose à faire dans ce cas, mais qui sait? Les indications fournies par Microsoft sont au mieux , incertaines, voire simplement déroutantes.

Pour tous ceux qui le trouvent et recherchent une solution VBScript. Voici ce que j'ai proposé de détecter si le contrôle de compte d'utilisateur est activé et, le cas échéant, de relancer mon script avec des privilèges élevés. Il suffit de mettre votre code dans la fonction Body (). J'ai trouvé qu'il y avait des problèmes de transportabilité entre XP et Windows 7 si j'écrivais du code pour qu'il soit toujours lancé avec élévation. En utilisant cette méthode, je contourne l’altitude s’il n’ya pas de CCU. Devrait également prendre en compte les versions de serveur 2008 et supérieures sur lesquelles UAC est activé.

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

D'après ce que je sais, UAC est un paramètre apolicy sur l'utilisateur ou le groupe local. Ainsi, vous pouvez lire cette propriété à partir de .Net. Désolé de ne pas avoir plus de détails mais j'espère que cela vous aidera

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top