Wenn ein Benutzer angemeldet ist, kann er mithilfe von quser.exe ganz einfach alle angemeldeten Benutzer anzeigen.
Ich möchte eine geplante Aufgabe (unter dem Namen SYSTEM) zu verschiedenen Zeiten ausführen, und eine Funktion im Skript könnte etwas tun, das einen Neustart auslösen könnte. Bevor diese Funktion ausgeführt wird, muss ich daher zunächst prüfen, ob Benutzer angemeldet sind.
Unter Win7 habe ich die folgende Ausgabe überprüft:
quser.exe 2>&1
für eine Zeichenfolge „Kein Benutzer vorhanden“, und das funktioniert großartig. Unter Win10 funktioniert es jedoch nicht.
Die Ausgabe desselben Befehls in Win10, wenn niemand angemeldet ist, scheint leer zu sein. Ein leerer Wert scheint ein riskanter Test zu sein, da es viele mögliche Fehlerquellen für eine leere Zeichenfolge gibt, die zu einem unerwarteten Neustart des Benutzers führen kann. Ich kann keine Benachrichtigung und keinen Countdown verwendenum den Benutzer zu warnen.
Gibt es eine andere (natürlich automatisierte) Möglichkeit, zu überprüfen, dass derzeit keine Benutzer angemeldet sind?
Antwort1
Anstatt (dh Benutzer abfragen) zu verwenden und sich auf eine gültige, leere Rückgabe zu verlassen, scheint (dh Sitzungen abfragen) quser
eine bessere Lösung zu sein .qwinsta
Fragen Sie grundsätzlich alle Sitzungen ab und analysieren Sie die Rückgabe nach Benutzernamen. Sitzungen, die unter Diensten oder SYSTEM ausgeführt werden, haben keinen Benutzernamen. In PowerShell gilt also:
$qwinstaOut = & "$env:windir\system32\QWinSta.exe"
if (-not $qwinstaOut) {
$UserSessions = "unknown"
} else {
$UserSessions = $qwinstaOut[1..($qwinstaOut.count-1)] | % {$_.substring(19)} | ? {$_ -match "^\w"}
}
# If there are no sessions with a username, this must be running as SYSTEM
if (-not $UserSessions) {
...
Wenn die Variable $userSessions
leer ist, sind keine Benutzer angemeldet. Wenn sie nicht leer ist, sind entweder Benutzer angemeldet oder es ist ein Fehler aufgetreten. Nicht perfekt, aber sicherer.