Dienstag, 24. September 2013

Scripting: Get Loggedon User + Informations

Ab und an kann es sein, dass man den aktuell am System angemeldete Benutzer herausfinden möchte. Relativ einfach ist es mit PowerShell und Get-WmiObject:

 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

Keine Kommentare:

Kommentar veröffentlichen