ich dabei bin, einen Skript zu schreiben, die die Ausgabe von dem Sysinternals-Befehl nimmt. Psloggedon.exe und gibt die Computernamen und welche Benutzer angemeldetPowershell: bevölkern benutzerdefiniertes Objekt von variablen Inhalten
ich zur Zeit Lassen Sie das Skript die folgenden Möglichkeiten erzeugen, abhängig davon, welche Ausgabe von jedem Computer bei der Abfrage ausgegeben wird.
DOMAIN \ computer name01
DOMAIN \ user-NameDOMAIN \ computer name02
DOMAIN \ user-Name
DOMAIN \ user-NameDOMAIN \ Computer-name03
Fehler beim VerbindenDOMÄNE \ computer-name04
Kein Benutzer in
Jeder Datenblock wird immer einen Computernamen entweder von der Liste der Benutzer angemeldet, gefolgt hat unterzeichnet ist, ein Fehler oder eine Meldung, die besagt, dass niemand in signiert ist.
Ich möchte die Daten einem benutzerdefinierten Objekt zuweisen, damit ich es in eine CSV ausgeben kann. Soweit ich weiß, ist dies der beste Weg, um eine richtige CSV zu generieren.
Wo ich mit dem benutzerdefinierten Objekt verwirrt bin, wie gehe ich mit einer Situation um, in der sich die eingehenden Daten in Betrag ändern? So habe ich zum Beispiel einen Computer, auf dem sich 4 Leute angemeldet haben. Ich verstehe auch nicht, wie ich die Spaltenüberschriften erstellen kann. Die meisten Beispiele, die ich gefunden habe, haben die Daten, die in das benutzerdefinierte Objekt eingegeben werden, bereits eigene Spaltenüberschriften oder Eigenschaften.
I zur Ausgabe suchen, die Daten so, dass es so etwas wie unten
DOMAIN \ Computer-Namen sucht, DOMAIN \ user-Name, DOMAIN \ user-Name
DOMAIN \ Computername, Fehler Nachricht
DOMAIN \ Computername, unterzeichnet niemand in
die Spaltenüberschrift über~~POS=TRUNC über den Computernamen würde „Computername“ sein und der Kopf des Benutzers/Fehlermeldung unterzeichnet/niemand angemeldet wäre "Status".
Microsoft hat dies ziemlich gut dokumentiert wie es scheint: https://technet.microsoft.com/en-us/library/ff730946.aspx
In diesem Beispiel verstehe ich nicht, wo „$ objBatter.Name“ herkommt. Wie kennt das Skript die Eigenschaft oder Spaltenüberschrift von der Eingabe? Sind die eingegebenen Daten bereits definiert?
Entschuldigung dafür, dass ich so verwirrend bin, es fällt mir schwer, mein Gehirn darum zu wickeln, also ist es schwer zu erklären.
Hier ist was ich versucht habe. Aber im Grunde gibt das benutzerdefinierte Objekt nur die Eigenschaften/Spaltenüberschriften aus (sorry, ich bin nicht wirklich sicher, wie das heißt). Der Rest ist leer.
$Computers = @(
,"computer-name01"
)
Foreach ($Computer in $Computers)
{
$loggedon = $null
If (Test-Connection -ComputerName $Computer -Quiet -Count 1)
{
$loggedon = (PsLoggedon.exe -x -l \\$Computer | Where-Object { ($_ -like "*DOMAIN\*" -or $_ -like "*No one*" -or $_ -like "*$Computer\*" -or $_ -like "*Error opening*")}).trim()
if ($loggedon -like "*Error Opening*")
{
Write-Output "Error occurred while attempting to connect. This computer is online."
Continue
} else {
$loggedon = ,"$Computer" + $loggedon
$colComputerAndUser = @()
foreach ($item in $loggedon)
{
$ObjComputerAndUser = New-Object System.Object
$ObjComputerAndUser | Add-Member -Type NoteProperty -Name Computer -Value $item.Computer
$ObjComputerAndUser | Add-Member -Type NoteProperty -Name User -Value $item.User
$colComputerAndUser += $ObjComputerAndUser
}
$colComputerAndUser
}
}
}
UPDATE 01
ich versuchte, den Code zu verwenden Sie zur Verfügung gestellt. Es funktionierte wie beabsichtigt, aber ich bekomme ein merkwürdiges Verhalten, wenn ein Computer mehr als nur eine angemeldete Person zurückgibt. Innerhalb des benutzerdefinierten Objekts wird der Computer mehrere Male angezeigt.
$Computers = @(
,"computer01"
,"computer02"
)
$colComputerAndUser = @()
Foreach ($Computer in $Computers)
{
$loggedon = $null
If (Test-Connection -ComputerName $Computer -Quiet -Count 1)
{
$loggedon = (PsLoggedon.exe -x -l \\$Computer | Where-Object { ($_ -like "*DOMAIN\*" -or $_ -like "*No one*" -or $_ -like "*$Computer\*" -or $_ -like "*Error opening*")}).trim()
$loggedon = [string]$loggedon
$ObjComputerAndUser = New-Object PSObject
$ObjComputerAndUser | Add-Member -Type NoteProperty -Name Computer -Value $Computer
$ObjComputerAndUser | Add-Member -Type NoteProperty -Name User -Value $loggedon
$colComputerAndUser += $ObjComputerAndUser
}
$colComputerAndUser
}
Computer-Benutzer
-------- ----
Computer01 DOMAIN \ user01 DOMAIN \ user02
Computer01 DOMAIN \ user01 DOMAIN \ user02
computer02 DOMAIN \ USER03
aktualisieren 02
Probe 01 aus der PsLoggedon.exe - ungeschnitten
PsLoggedon v1.35 - See who's logged on
Copyright (C) 2000-2016 Mark Russinovich
Sysinternals - www.sysinternals.com
Users logged on locally:
DOMAIN\user.name01
DOMAIN\user.name02
Probe 02 aus der PsLoggedon.exe - ungeschnitten
PsLoggedon v1.35 - See who's logged on
Copyright (C) 2000-2016 Mark Russinovich
Sysinternals - www.sysinternals.com
Users logged on locally:
LOCALMACHINE\local.user01
LOCALMACHINE\local.user04
DOMAIN\user.name15
DOMAIN\user.name17
UPDATE 03 Dieser Code tatsächlich funktioniert, aber ich gestellt hatte das ist im falschen Teil des Codes.
$Computers = @(
,"computer01"
,"computer02"
,"computer03"
,"computer04"
,"computer05"
)
$colComputerAndUser = @()
Foreach ($Computer in $Computers)
{
$loggedon = $null
If (Test-Connection -ComputerName $Computer -Quiet -Count 1)
{
$loggedon = (PsLoggedon.exe -x -l \\$Computer | Where-Object { ($_ -like "*DOMAIN\*" -or $_ -like "*No one*" -or $_ -like "*$Computer\*" -or $_ -like "*Error opening*")}).trim()
$loggedon = [string]$loggedon
$ObjComputerAndUser = New-Object PSObject
$ObjComputerAndUser | Add-Member -Type NoteProperty -Name Computer -Value $Computer
$ObjComputerAndUser | Add-Member -Type NoteProperty -Name User -Value $loggedon
$colComputerAndUser += $ObjComputerAndUser
}
}
$colComputerAndUser
Wo dieser Code unterscheidet, ist, wo die endgültige $ colComputerNameUser platziert wird. Ursprünglich hatte ich es in der foreach-Schleife enthalten, wodurch die Ausgabe dupliziert wurde. Es kommt jetzt nach der Schleife und die Ausgabe funktioniert korrekt.
Ich habe versucht zu implementieren, was Sie vorgeschlagen haben. Es funktioniert, außer dass ich wiederholende Ausgaben bekomme, wenn ein Computer mehr als einen Benutzer zurückgibt. Ich vermute, dass ich ein Detail verpasst habe. Ich bin nicht ganz sicher, was Sie meinen, indem Sie alle Werte nach ComputerName verketten. Meinst du sie alle auf Variable setzen? Oder einfach sicherstellen, dass alle Werte in einer einzigen Zeile stehen? Entschuldigung für meine Ignoranz, das ist weit fortgeschrittener als das, was ich gewohnt bin. – bourne
Können Sie eine Beispielausgabe von PsLoggedon.exe posten? – Arluin
Unter UPDATE 02 habe ich eine unbearbeitete Ausgabe von der PsLoggedon.exe hinzugefügt (mit Ausnahme der eigentlichen Domäne). Ich glaube, das Duplikat im benutzerdefinierten Objekt ist möglich, da einige Computer mehr als einen Benutzer zurückgeben können. Beim Hinzufügen der Werte zum Objekt passiert etwas Seltsames. – bourne