Get-WmiObject -Class Win32_ComputerSystem | SELECT Username
Als Ergebnis erhält man:
PS C:\> Get-WmiObject -Class Win32_ComputerSystem | SELECT Username Username -------- Domain\schilzm
Das der aktuelle Benutzer an meinem Rechner schilzm ist, wer hätte es gedacht!? Interessant wird es dann wenn man via Get-WmiObject auf einen Remotecomputer zugreift. Dies geht recht einfach über den Parameter Computer:
Get-WmiObject -Class Win32_ComputerSystem -Computer RemotePC1 | SELECT Username
Das Ergebnis ist analog zum vorherigen. Der Remotecomputer muss natürlich richtig konfiguriert sein. Eine gute Übersicht bietet folgender Artikel:
WindowsPro: Remote-Zugriffe für WMI konfigurieren und testen
Wenn man jetzt etwas mehr Informationen über den Benutzer haben möchte, kann man das mit der WMI-Klasse Win32_NetworkloginProfile erreichen.
Als einen ersten Test gibt man folgendes ein:
Get-WmiObject -Class Win32_NetworkloginProfile
Ergebnis:
PS C:\> Get-WmiObject -Class Win32_NetworkloginProfile Caption : NT-AUTORITÄT\SYSTEM Privileges : Profile : UserId : UserType : Workstations : Caption : schilzm Privileges : 1 Profile : \\path\to\schilzm UserId : 23926 UserType : Normal Account Workstations :
Wie man sieht gibt es zwei Instanzen der Klasse. Damit man nun die des interessanten Benutzers bekommt macht man ein Query:
Get-WmiObject -Query "SELECT * FROM Win32_NetworkLoginProfile WHERE Caption = 'schilzm'"
Ergebins:
PS C:\> Get-WmiObject -Query "SELECT * FROM Win32_NetworkLoginProfile WHERE Caption = 'schilzm'" Caption : schilzm Privileges : 1 Profile : \\path\to\schilzm UserId : 23926 UserType : Normal Account Workstations :
Aber welche Informationen bekommt man nun aus der Class Win32_NetworkLoginProfile!? Um das zu sehen verwendet man das Cmdlet "Get-Member":
Get-WmiObject -Class Win32_NetworkLoginProfile | Get-Member
Der Ergebnis:
Name MemberType Definition ---- ---------- ---------- AccountExpires Property System.String AccountExpires {get;set;} AuthorizationFlags Property System.UInt32 AuthorizationFlags {get;set;} BadPasswordCount Property System.UInt32 BadPasswordCount {get;set;} Caption Property System.String Caption {get;set;} CodePage Property System.UInt32 CodePage {get;set;} Comment Property System.String Comment {get;set;} CountryCode Property System.UInt32 CountryCode {get;set;} Description Property System.String Description {get;set;} Flags Property System.UInt32 Flags {get;set;} FullName Property System.String FullName {get;set;} HomeDirectory Property System.String HomeDirectory {get;set;} HomeDirectoryDrive Property System.String HomeDirectoryDrive {get;set;} LastLogoff Property System.String LastLogoff {get;set;} LastLogon Property System.String LastLogon {get;set;} LogonHours Property System.String LogonHours {get;set;} LogonServer Property System.String LogonServer {get;set;} MaximumStorage Property System.UInt64 MaximumStorage {get;set;} Name Property System.String Name {get;set;} NumberOfLogons Property System.UInt32 NumberOfLogons {get;set;} Parameters Property System.String Parameters {get;set;} PasswordAge Property System.String PasswordAge {get;set;} PasswordExpires Property System.String PasswordExpires {get;set;} PrimaryGroupId Property System.UInt32 PrimaryGroupId {get;set;} Privileges Property System.UInt32 Privileges {get;set;} Profile Property System.String Profile {get;set;} ScriptPath Property System.String ScriptPath {get;set;} SettingID Property System.String SettingID {get;set;} UnitsPerWeek Property System.UInt32 UnitsPerWeek {get;set;} UserComment Property System.String UserComment {get;set;} UserId Property System.UInt32 UserId {get;set;} UserType Property System.String UserType {get;set;} Workstations Property System.String Workstations {get;set;} ConvertFromDateTime ScriptMethod System.Object ConvertFromDateTime(); ConvertToDateTime ScriptMethod System.Object ConvertToDateTime();
Wie man sieht gibt es hier einige Informationen zu dem Benutzer. Mutmaßlich sind nicht alle relevant für die zu erfüllende Aufgabe. Mit folgendem Code kann man sich aus den beiden Klassen die Informationen zusammen stellen die man möchte und dann ein neues Object zurückgeben, dass alle Informationen enthält:
[WMI]$cs = Get-WmiObject -Class Win32_Computersystem [WMI]$nlp = Get-WmiObject -Query "SELECT * FROM Win32_NetworkLoginProfile WHERE Caption = '$($cs.username.split("\")[1])'" [hashtable]$UserInfo = @{ 'LoggedOnComputer'=$cs.Name; 'Model' = $cs.Model; 'Manufacturer' = $cs.Manufacturer; 'Username' = $nlp.Caption; 'Fullname' = $nlp.FullName; 'LastLogon' = $nlp.ConverttoDateTime($nlp.LastLogon); 'LogonTime' = New-Timespan -start $nlp.ConverttoDateTime($nlp.LastLogon) -End (Get-Date) } $UserInfo
Das Ergebnis:
Name Value ---- ----- LogonTime 19:47:05.9934687 Manufacturer Dell Inc. LoggedOnComputer MyCompi1 LastLogon 23.09.2013 16:23:51 Username schilzm Model Precision T1500 Fullname Schilz, Marc