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

http://gist.github.com/65931

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?

Était-ce utile?

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...
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top