Détecter en cas d'exécution avec des privilèges d'administrateur sous Windows XP
-
05-09-2019 - |
Question
Je suis en train de travailler sur la façon de détecter si un utilisateur est en cours d'exécution avec des droits d'administrateur sous Windows XP. Cela est assez facile à faire dans Vista / Windows 7 grâce à la commande whoami . Voici un extrait de Ruby pour savoir comment faire sous Vista:
Notez le lien suivant intègre désormais la solution proposée par muteW
Le problème est, whoami ne vient pas avec Windows XP et ainsi la méthode ci-dessus lié retournera toujours faux sur Windows XP, même si nous sommes en cours d'exécution en tant qu'administrateur.
Alors, est-ce que quelqu'un sait d'une façon de détecter si nous courons comme administrateur sous Windows XP en utilisant Ruby, les outils de ligne de commande, batch-fichiers, ou même tiers (doit être open source, vraiment) outils?
La solution
détecte si l'utilisateur est en cours d'exécution en mode élevé (par exemple, une invite de commande qui était administrateur « Exécuter en tant que »). Elle repose sur le fait que vous avez besoin des privilèges d'administrateur pour lire le compte SERVICE LOCAL touche reg:
reg query "HKU\S-1-5-19"
renvoie un code d'erreur non nul si elle ne peut pas être lu, et zéro si possible.
Fonctionne à partir de XP jusqu'à ...
Autres conseils
Si vous exécutez
>net localgroup administrators
dans un shell de commande, vous devriez obtenir la liste des comptes d'administrateur sous Windows XP. Il suffit de scanner et analyser la sortie pour vérifier le compte utilisateur particulier que vous voulez. Pour exemple pour vérifier si l'utilisateur actuel est un administrateur que vous pourriez faire -
>net localgroup administrators | find "%USERNAME%"
Option Piskvor son amende, ou vérifier url http: // weseetips. com / 2008/04/16 / how-to-check-si ont-administrateur-courant utilisateur privilège /
est le code dans cette page
SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
PSID AdministratorsGroup;
// Initialize SID.
if( !AllocateAndInitializeSid( &NtAuthority,
2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0,
&AdministratorsGroup))
{
// Initializing SID Failed.
return false;
}
// Check whether the token is present in admin group.
BOOL IsInAdminGroup = FALSE;
if( !CheckTokenMembership( NULL,
AdministratorsGroup,
&IsInAdminGroup ))
{
// Error occurred.
IsInAdminGroup = FALSE;
}
// Free SID and return.
FreeSid(AdministratorsGroup);
return IsInAdminGroup;
Consultez la méthode CheckTokenMembership . Il y a un échantillon de mise en œuvre y IsUserAdmin () plus d'autres commentaires de la communauté utile lorsque cette fonction ne retourne pas ce qu'on attend et ce qu'il faut faire pour l'améliorer.
Ceci trouvera sans les bombardements:
require 'win32/registry'
is_admin = false
begin
Win32::Registry::HKEY_USERS.open('S-1-5-19') {|reg| }
is_admin = true
rescue
end
La stratégie est similaire à Pierre, mais avec moins de frais généraux.
Voici la meilleure façon de faire (PowerShell) il: https://stackoverflow.com/a/16617861/863980
Dans une ligne, vous pouvez dire (copier / coller dans snob et il fonctionnera):
(@(([ADSI]"WinNT://./Administrators,group").psbase.Invoke("Members")) | `
foreach {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}) -contains "Administrator"
=> retourne True
lorsque l'utilisateur appartient au groupe Administrateurs (par opposition à l'utilisateur le contrôle IS Administrator)
(Note: backtick ou accent grave `échappe au retour du chariot en PowerShell, en Ruby il exécute les commandes de shell, comme 'système de (' C ++ de commande ') ..)
Donc, en Ruby, vous pouvez dire (copier / coller dans RIR):
def is_current_user_local_admin?
return `powershell "(@(([ADSI]'WinNT://./Administrators,group').psbase.Invoke('Members')) | foreach {$_.GetType().InvokeMember('Name', 'GetProperty', $null, $_, $null)}) -contains 'Administrator'"`.include? "True"
end
Je ne sais pas (encore mieux) façon WMI de le faire bien. Avec cela, vous auriez pu faire quelque chose comme (Ruby nouveau):
require 'win32ole'
wmi = WIN32OLE.connect('WinNT://./Administrators,group')
# don't know what should come here...