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 de l'UAC sur l'ordinateur de l'utilisateur?Comment détecter si Vista UAC est activé?
Répondre
Cette clé de Registre doit vous dire:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
Valeur EnableLUA (DWORD)
1
activé/0
manquant ou désactivé
Mais cela suppose que vous avoir 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 UAC activé (voir here). Pas infaillible, mais cela peut fonctionner.
La question ici est plus d'un "pourquoi avez-vous besoin de savoir" - il a une incidence sur la réponse. Vraiment, il n'y a pas d'API parce que du point de vue du comportement du système d'exploitation, ce qui compte est si l'utilisateur est un administrateur ou non - comment ils choisissent de se protéger en tant qu'administrateur est leur problème.
Ceci est une capture 22. Si l'UAC est activé, il y a de fortes chances que vous n'ayez pas le droit de le lire. –
Une correction mineure: la clé de registre est HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Policies \ System, et EnableLUA est une valeur DWORD (ce n'est pas une clé). HTH –
Vous devez utiliser! = 0 et ne pas comparer avec 1 selon la source google chrome (Apparemment certains systèmes ont des valeurs> – Anders
Vérifier la valeur de registre HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Policies \ System
La valeur EnableLUA détermine si UAC est actif.
This post a un exemple de code en C# pour tester 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 l'interpréter au besoin. Également lié il y a un exemple qui montre la même en C++
http://www.itwriting.com/blog/198-c-code-to-detect-uac-elevation-on-vista.html
Le code dans ce poste ne se contente pas de lire à partir du Registre. Si le contrôle de compte d'utilisateur est activé, il se peut que vous n'ayez pas le droit de le lire dans le registre.
AFAIK, UAC est défini sur l'utilisateur ou le groupe local. Vous pouvez donc lire cette propriété depuis .Net. Désolé de ne pas avoir plus de détails mais j'espère que cela aide
Vous pouvez le faire soit d'examiner la valeur DWORD EnableLUA dans la clé de Registre suivante:
HKLM/SOFTWARE/Microsoft/Windows/CurrentVersion/Politiques/système
Si la valeur est 0 (ou n'existe pas) alors l'UAC est désactivé. Si elle est présente et non nul, UAC est 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;
}
Notez que si l'utilisateur a changé l'état de l'UAC, mais n'a pas redémarré l'ordinateur encore, cette fonction retourne un résultat incohérent.
Vous ne voulez pas vérifier si l'UAC est activé; ça ne vous dit rien.
Je peux être un utilisateur standard avec UAC désactivé.
Vous voulez vérifier 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;
Ce poste est assez ancienne, mais je voulais faire des commentaires sur le « pourquoi avez-vous besoin de savoir » et les bits « vérifier l'adhésion jeton ». Le fait est que la documentation de Microsoft indique que «Si le contrôle de compte utilisateur a été désactivé et qu'un utilisateur standard tente d'effectuer 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 tente l'élévation. Voir http://msdn.microsoft.com/en-us/library/windows/desktop/aa511445.aspx vers le bas pour les détails. Comment faisons-nous pour cela sans un moyen de vérifier si l'UAC est activé?
Peut-être vérifier si l'utilisateur s'exécute avec des privilèges d'administrateur est la bonne chose à faire dans ce cas, mais qui sait? Les conseils que Microsoft donne est, au mieux, iffy, sinon carrément confus.
Pour tous ceux qui trouvent cela et qui recherchent une solution VBScript. Voici ce que j'ai trouvé pour détecter si l'UAC est activé et si c'est le cas, relancez 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 toujours lancer élevé. En utilisant cette méthode, je contourne l'élévation s'il n'y a pas d'UAC. Devrait également prendre en compte 2008 et versions de serveur ci-dessus qui ont UAC 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
Pouvez-vous expliquer pourquoi vous en avez besoin? –
Par exemple, j'ai une application qui utilise une API pour un programme externe qui nécessite que l'UAC soit activé pour fonctionner. Si l'UAC est éteint, je voudrais informer l'utilisateur avec une fenêtre de dialogue. –