2016-09-30 1 views
0

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-Name

DOMAIN \ computer name02
DOMAIN \ user-Name
DOMAIN \ user-Name

DOMAIN \ Computer-name03
Fehler beim Verbinden

DOMÄ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.

Antwort

1

Erstellen Sie ein Objekt mit zwei Eigenschaften: ComputerName, Benutzer. Verketten Sie alle Werte nach dem Computernamen in einer Zeichenfolge, und weisen Sie die Zeichenfolge dem Benutzerattribut zu.

$Computers = @(,"computername") 

Foreach ($Computer in $Computers) 
{ 
$loggedon = $null 
if (Test-Connection -ComputerName $Computer -Quiet -Count 1){ 
    $loggedon = (.\PsLoggedon.exe -x -l \\$Computer) 

    if ($loggedon -like "*Error Opening*"){ 
     Write-Output "Error occurred while attempting to connect. This computer is online." 
     Continue 
    } else { 
     $loggedon = ,"$Computer" + $loggedon 

     $colComputerAndUser = @() 

     $UserString = "" 
     for($Cnt = 9;$Cnt -lt $loggedon.Count;$Cnt++) 
     { 
      $UserString += ($loggedon[$Cnt]).Trim() + "`n" 
     } 
     $ObjComputerAndUser = New-Object System.Object 
     $ObjComputerAndUser | Add-Member -Type NoteProperty -Name Computer -Value $Computer 
     $ObjComputerAndUser | Add-Member -Type NoteProperty -Name User -Value $UserString 
     $colComputerAndUser += $ObjComputerAndUser 
    } 
    } 
} 
$colComputerAndUser | format-table -wrap 

Nicht meine eleganteste Arbeit, aber es funktioniert. Ich mag es nicht, den Start der Array-Zählung auf 9 hart zu codieren. Ich habe versucht, auf den Doppelpunkt zu splitten, aber er teilt sich einfach auf jedes `n in der Ausgabe von PsLoggedon auf. Ich könnte versuchen, das später zu verfeinern. Ich habe auch versucht, einen globalen Regex auf [Regex] '(? [^ \]) ​​\ (?. *)' Zu finden, aber das hat auch nicht funktioniert. Ich habe die Ergebnisse erhalten, konnte aber die Ergebnisse nicht aufzählen.

+0

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

+0

Können Sie eine Beispielausgabe von PsLoggedon.exe posten? – Arluin

+0

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

Verwandte Themen