Letzter eingeloggter Nutzer - Abfrage

Antworten
bionix
Beiträge: 5
Registriert: 25 Aug 2023, 11:28

Letzter eingeloggter Nutzer - Abfrage

Beitrag von bionix »

Hallo liebes Forum,
ich bin seit gestern dran ein kleines Script zu schreiben um den letzten eingeloggten Nutzer eines PCs in unserem Unternehmen zu finden.
Dazu habe ich eine Action erstellt:

Code: Alles auswählen

[ExecWith_ps]
function ExecWith_ps{
	$var = (Get-WmiObject -Class Win32_NetworkLoginProfile |
	Sort-Object -Property LastLogon -Descending |
	Select-Object -Property * -First 1 |
	Where-Object {$_.LastLogon -match "(\d{14})"}).name
	return $var
}
$list = ExecWith_ps
return $list
oder auch:

Code: Alles auswählen

[ExecWith_ps]
$var = (Get-WmiObject -Class Win32_NetworkLoginProfile |
Sort-Object -Property LastLogon -Descending |
Select-Object -Property * -First 1 |
Where-Object {$_.LastLogon -match "(\d{14})"}).name
return $var
kurz gesagt, die Powershell Abfrage gibt auch soweit das aus, was ich haben möchte.

Allerdings bin ich am verzweifeln daran, den Rückgabewert der Powershell-Abfrage wieder ins Opsi zu bekommen.
Ich habe bereits einiges getestet, allerdings meistens nur eine 1 oder 0 angezeigt bekommen.

Code: Alles auswählen

;DefVar $policy$
;DefVar $list$
DefVar $user$
DefStringList $list$
;DefVar $lastuserlogin$
;Set $lastuserlogin$ = takeString(0,shellCall('powershell.exe (Get-WmiObject -Class Win32_ComputerSystem).UserName'))
;shellCall('powershell.exe set-executionpolicy RemoteSigned')
;Set $lastuserlogin$ = ExecWith_ps  winst /64Bit

;set $policy$ = takeString(0,shellCall('powershell.exe get-executionpolicy '))
;shellCall('powershell.exe set-executionpolicy RemoteSigned')
;Execwith_ps powershell.exe -ExecutionPolicy RemoteSigned
;shellCall('powershell.exe set-executionpolicy '+$policy$')
;set $list$ = getLastExitcode

;set $list$ = Execwith_ps powershell.exe -ExecutionPolicy RemoteSigned
set $list$ = getReturnListFromSection('ExecWith_ps')
;set $list$ = Execwith_ps powershell.exe
set $user$ = composeString($list$,"test") 

;set $list$ = powershellCall('(Get-WmiObject -Class Win32_NetworkLoginProfile | Sort-Object -Property LastLogon -Descending | Select-Object -Property * -First 1 | Where-Object {$_.LastLogon -match "(\d{14})"}).name')
;Execwith_ps powershell.exe -ExecutionPolicy RemoteSigned
;set $list$ = ExecWith_ps powershell.exe
Ausgabe dann in Opsi-Notizen:

Code: Alles auswählen

Set $HostNotes$ = $ProcCores$+"\n"+$ProcInfo$+"\n"+"RAM: "+$Memory$+"\n"+"BIOS-Version: \n"+$Bios$+"\n\n"+"IP: "+$IP-Adresse$+"\n"+"MAC: "+$MAC-Adresse$+"\n\n"+$OSVersion$+"\n"+$ImageVersion$+"\n"+"Installiert am: "+$InstallDate$+"\n"+"Letzter Benutzer: "+$LastUser$+"\nlast: "+$user$
Wie kann ich den Rückgabewert der Powershell-Abfrage in den Opsi-Notizen ausgeben?
Mit dem aktuellen Testcode, der nicht auskommentiert ist, bekomme ich leider nur einen leeren String angezeigt.

Kann mir da jemand helfen oder hat eine Idee?
Ich bin erst in Opsiscript eingestiegen und kenne noch nicht alle passenden Befehle etc.

Vielen Dank und liebe Grüße
David
Benutzeravatar
SisterOfMercy
Beiträge: 1524
Registriert: 22 Jun 2012, 19:18

Re: Letzter eingeloggter Nutzer - Abfrage

Beitrag von SisterOfMercy »

Why don't you just read this value from the registry?

Code: Alles auswählen

DefVar $lastuser$
set $lastuser$ = getRegistryValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI", "LastLoggedOnUser")
Bitte schreiben Sie Deutsch, when I'm responding in the German-speaking part of the forum!
Jan.Schmidt
Beiträge: 439
Registriert: 08 Jul 2017, 12:02

Re: Letzter eingeloggter Nutzer - Abfrage

Beitrag von Jan.Schmidt »

Hi,

ich würde dir einen zwischenweg vorschlagen.

Anstatt das direkt durchzuziehen, mounte eine Freigabe (z.b. auf dem OPsi) und schreibe eine "machdas" in den OPSi

Code: Alles auswählen

echo "opsi-admin -d method setHostDescription "%computername%.domain.suffix" "\""$lastuser$"\" >> Client_descrption.sh
Die schaust du dir dann an, wirfst die unstimmigkeuten - bei neu aufgesetzten Rechnern usw. - raus und importierst die Beschreibung "manuell"
bionix
Beiträge: 5
Registriert: 25 Aug 2023, 11:28

Re: Letzter eingeloggter Nutzer - Abfrage

Beitrag von bionix »

Danke für eure Beiträge,
tatsächlich scheint es so zu sein, dass man das nicht direkt in quasi einer Zeile machen kann, sondern wie oben du schon sagtest ein Umweg nötig ist. Powershell Ausgabe in eine Textdatei und dann mit Opsi diese auslesen. Den Versuch von Jan.Schmidt werde ich die Tage noch einmal versuchen und Rückmeldung geben.

Vielen Dank schonmal
Grüße
David
bionix
Beiträge: 5
Registriert: 25 Aug 2023, 11:28

Re: Letzter eingeloggter Nutzer - Abfrage

Beitrag von bionix »

SisterOfMercy hat geschrieben: 25 Aug 2023, 17:18 Why don't you just read this value from the registry?

Code: Alles auswählen

DefVar $lastuser$
set $lastuser$ = getRegistryValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI", "LastLoggedOnUser")
Dort ist nur der aktuell eingeloggte Nutzer zu finden. Nicht der, der auch als letztes angemeldet war, falls momentan keiner angemeldet ist. Sehe ich das richtig?
Patrick89bvb
Beiträge: 44
Registriert: 05 Nov 2015, 11:26

Re: Letzter eingeloggter Nutzer - Abfrage

Beitrag von Patrick89bvb »

Hey!

Also du könntest die powershell Resultat als Liste zurückgeben:

DefStringList $Resultlist$ = powershellcall('Get-WmiObject -Class Win32_NetworkLoginProfile | Select-Object Name,Lastlogon | Sort-Object Lastlogon')
Den oberen powershell-Befeh kannst du mit Format-Custom/Format-List/Format-Table ergänzen.

Zum Beispiel:

Code: Alles auswählen

DefStringList $Resultlist$ = powershellcall('Get-WmiObject -Class Win32_NetworkLoginProfile | Select-Object Name,Lastlogon | Sort-Object Lastlogon | Format-Table')
Defvar $LastLogonUser% = takeString(0,reverse $Resultlist$))
Dann hast du den gesamten String mit dem Username und der LastLogin.

Gruß,
Patrick
Jan.Schmidt
Beiträge: 439
Registriert: 08 Jul 2017, 12:02

Re: Letzter eingeloggter Nutzer - Abfrage

Beitrag von Jan.Schmidt »

bionix hat geschrieben: 28 Aug 2023, 08:35 Dort ist nur der aktuell zuletzt eingeloggte Nutzer zu finden. Also der, der auch als letztes angemeldet war,
Wenn aber niemand da ein Profil angelegt hat, der Rechner also Frischfleisch von der Stange ist - dann ist der Eintrag leer.
bionix
Beiträge: 5
Registriert: 25 Aug 2023, 11:28

Re: Letzter eingeloggter Nutzer - Abfrage

Beitrag von bionix »

Patrick89bvb hat geschrieben: 28 Aug 2023, 16:23 Hey!

Also du könntest die powershell Resultat als Liste zurückgeben:

DefStringList $Resultlist$ = powershellcall('Get-WmiObject -Class Win32_NetworkLoginProfile | Select-Object Name,Lastlogon | Sort-Object Lastlogon')
Den oberen powershell-Befeh kannst du mit Format-Custom/Format-List/Format-Table ergänzen.

Zum Beispiel:

Code: Alles auswählen

DefStringList $Resultlist$ = powershellcall('Get-WmiObject -Class Win32_NetworkLoginProfile | Select-Object Name,Lastlogon | Sort-Object Lastlogon | Format-Table')
Defvar $LastLogonUser% = takeString(0,reverse $Resultlist$))
Dann hast du den gesamten String mit dem Username und der LastLogin.

Gruß,
Patrick
Hey Patrick,
Danke erstmal. Habe den Code wie folgt mal eingebaut und getestet. Meine Testumgebung ist eine VM, habe dort die Inventarisierung vor dem Login durchlaufen lassen, nachdem ich eingeloggt war und nach dem ausloggen. Leider bekomme ich nur leere Strings in den Opsi Notizen angezeigt.

Code: Alles auswählen

DefStringList $Resultlist$ = powershellcall('Get-WmiObject -Class Win32_NetworkLoginProfile | Select-Object Name,Lastlogon | Sort-Object Lastlogon | Format-Table')
Defvar $LastLogonUser$ = takeString(0,reverse ($Resultlist$))
Bild
https://ibb.co/LvCzWR5
Patrick89bvb
Beiträge: 44
Registriert: 05 Nov 2015, 11:26

Re: Letzter eingeloggter Nutzer - Abfrage

Beitrag von Patrick89bvb »

Habe mal mein (trockenen)Skript ausprobiert und mir sind dabei drei Fehler passiert :oops:, aber das ist jetzt korrekt:

Code: Alles auswählen

DefStringList $Resultlist$ = powershellcall('Get-WmiObject -Class Win32_NetworkLoginProfile | Select-Object Name,Lastlogon | Sort-Object Lastlogon | Format-Table')
Defvar $LastLogonUser$ = takeString(2,reverse($Resultlist$))
oder als Einzeiler möglich:

Code: Alles auswählen

Defvar $LastLogonUser$ = takeString(2,reverse(powershellcall('Get-WmiObject -Class Win32_NetworkLoginProfile | Select-Object Name,Lastlogon | Sort-Object Lastlogon | Format-Table')))
Ich hatte noch vergessen, dass bei der Ausgabe des Powershell-Befehl noch zwei leeren Zeilen entstehen. Da muss der Pointer für "takestring" statt auf 0, auf 2 gesetzt werden.

Jetzt bekommt die Variable $LastLogonUser$ den zuletzt angemeldeten User als String zurückgeliefert.

Mein Skript kann man sicher noch optimieren/verbessern ...

Offtopic: Ich stelle fest, dass meine Login über RDP-Session auf mein Test-Gerät nicht als "Lastlogon" gezählt wird. :| Da ist der Wert auch etwas unpassend.
bionix
Beiträge: 5
Registriert: 25 Aug 2023, 11:28

Re: Letzter eingeloggter Nutzer - Abfrage

Beitrag von bionix »

Vielen Dank an Patrick,
das sieht soweit gut aus. Ich werde es so implementieren und noch weitere Tests durchführen. Zudem wird die Ausgabe noch etwas angepasst.

Grüße
David
Antworten