Ruby - Opdag, hvis du kører med administratorrettigheder under Windows XP

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at finde ud af, hvordan man opdager, om en bruger kører med administratorrettigheder under Windows XP. Dette er ret nemt at gøre i Vista/Win7 takket være whoami kommandoen. Her er et uddrag i Ruby for at gøre det under Vista:


Bemærk, at følgende link nu indeholder løsningen foreslået af muteW


http://gist.github.com/65931[10]


Problemet er, whoami kommer ikke med Windows XP, og den ovenfor forbundne metode vil altid vende tilbage på WinXP, selvom vi kører som administrator.


Så ved nogen om en måde at opdage, om vi kører som administrator under Windows XP ved hjælp af Ruby, kommandolinjeværktøjer, batch-filer eller endda tredjepart (skal være open source, virkelig) værktøjer?

Bedste reference


Dette vil opdage, om brugeren kører i forhøjet tilstand (f.eks. En kommandoprompt, der var 'Kør som' administrator). Det er afhængig af, at du har brug for administratorrettigheder til at læse REGAL SERVICE-regnsnøglen:


reg query "HKUS-1-5-19"


Dette vil returnere en fejlkode uden fejl, hvis den ikke kan læses, og nul hvis den kan.

Fungerer fra XP op ...

Andre referencer 1


Hvis du løber


>net localgroup administrators 


i en kommando skal du få listen over administrator konti i Windows XP. Du skal blot analysere og scanne output for at tjekke for den ønskede brugerkonto, du vil have. For f.eks. at kontrollere, om den nuværende bruger er en administrator, du kunne gøre -


>net localgroup administrators | find "\%USERNAME\%"

Andre referencer 2


Piskvor mulighed er fint, eller tjek denne url
http://weseetips.com/2008/04/16/how-to-check-whether-current-user-have-administrator-privilege/[11]


Dette er koden på den side


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;

Andre referencer 3


Se CheckTokenMembership-metoden. Der er en prøve der med implementeringen af ​​IsUserAdmin () samt nogle andre nyttige tilbagemelding på fællesskabet, når den funktion ikke returnerer, hvad der forventes og hvad man skal gøre for at forbedre det. [12]

Andre referencer 4


Dette vil finde ud af uden shelling ud:


require 'win32/registry'

is\_admin = false
begin
  Win32::Registry::HKEY\_USERS.open('S-1-5-19') {|reg| }
  is\_admin = true
rescue
end


Strategien ligner Peters, men med mindre overhead.

Andre referencer 5


Her er den bedre (PowerShell) måde at gøre det på: https://stackoverflow.com/a/16617861/863980


I en linje kan du sige (kopiere/indsætte i posh og det vil fungere):


(@(([ADSI]"WinNT://./Administrators,group").psbase.Invoke("Members")) | `
foreach {$\_.GetType().InvokeMember("Name", 'GetProperty', $null, $\_, $null)}) -contains "Administrator"


=> returnerer True, når bruger tilhører Administrators gruppe (i modsætning til at kontrollere brugerens IS Administrator)


(Bemærk: backtick eller grave accent `undgår vognreturet i PowerShell, i Ruby udføres shell kommandoerne, som C ++ system (' command ') ..)


Så i Ruby kan du sige (kopiere/indsætte i irb):


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


Jeg ved ikke den (endnu bedre) WMI måde at gøre det på. Med det kunne du have gjort noget lignende (i Ruby igen):


require 'win32ole'
wmi = WIN32OLE.connect('WinNT://./Administrators,group')
# don't know what should come here...