makaroni
Goto Top

Powershell Ausgabe formatieren

Guten Morgen zusammen,

ich lesen aus einer Active Directory via Powershell User aus einer Gruppe aus und speicher diese in eine .txt Datei.

Dafür nutze ich unter Anderem folgenden Code:

$Output_File = "\\pfad"  
$all = @() 
$all += Get-ADGroupMember -Recursive $AD_Group -Server $Server -Credential $cred
$all += Get-ADGroupMember $AD_Group -Server $Server -Credential $cred | ?{$_.objectClass -eq "group"} | Get-ADGroupMember -Recursive   
$all = $all | select -Unique 
$all = $all | ft name
$all = $all | Out-File "$Output_File"   
$all

Nun soll die Textdatei zum Teil mit konstanten Inhalt gefüllt werden wie z.B.

2014-12-22 00:00:01 10 10.1.1.1 200 TCP_HIT 1 1 GET http www.test.de/ 80 /styles/1.png (konstanter Teil) User aus dem AD (dynamischer Teil)

Wie formatiere ich das in Powershell? Bzw. wie bekomme ich die Ausgabe so hin?

Viele Grüße

Content-Key: 259073

Url: https://administrator.de/contentid/259073

Printed on: April 19, 2024 at 05:04 o'clock

Member: Doskias
Doskias Jan 07, 2015 at 08:50:58 (UTC)
Goto Top
Hallo Sebastian,

verstehe ich dich richtig, dass du als Konstante ein bestimmtes Datum & Uhrzei verwenden möchtest?

Gruß
Doskias
Member: makaroni
makaroni Jan 07, 2015 at 08:58:56 (UTC)
Goto Top
Hey Doskias,

nein nicht ganz, vor jedem User soll einfach der konstante Teil stehen
2014-12-22 00:00:01 10 10.1.1.1 200 TCP_HIT 1 1 GET http www.test.de/ 80 /styles/1.png (konstanter Teil) User aus dem AD (dynamischer Teil)


Also dieser Teil wäre in JEDER Zeile identisch, danach würden dann einfach die User kommen mit z.B. Domäne/User...

Grüße
Member: Doskias
Doskias Jan 07, 2015 updated at 09:02:19 (UTC)
Goto Top
Unabhängig von meiner Nachfrage mein Vorschlag:
$fester_teil="2014-12-22 00:00:01 10 10.1.1.1 200 TCP_HIT 1 1 GET http www.test.de/ 80 /styles/1.png "  
$Dynamischer_teil=$all

$fester_Teil + $dynamischer_teil | out-file $Output_File -append

Wenn $all dein dynmaischer Teil ist, dann kannst du auch die entsprechende Variable nehmen.
"2014-12-22 00:00:01 10 10.1.1.1 200 TCP_HIT 1 1 GET http www.test.de/ 80 /styles/1.png " + $all | out-file $Output_File -append  
würde auch gehen
Member: colinardo
Solution colinardo Jan 07, 2015 updated at 09:28:33 (UTC)
Goto Top
Hallo Sebastian,
z.B. so
$Output_File = "\\pfad"  
$all = @() 
$all += Get-ADGroupMember -Recursive $AD_Group -Server $Server -Credential $cred
$all += Get-ADGroupMember $AD_Group -Server $Server -Credential $cred | ?{$_.objectClass -eq "group"} | Get-ADGroupMember -Recursive   
$all | select -Unique | select Name, @{n='Konstante';e={'2014-12-22 00:00:01 10 10.1.1.1 200 TCP_HIT 1 1 GET http www.test.de/ 80 /styles/1.png'}} | ft Konstante,Name -AutoSize | out-string -width 10000 | Out-File $Output_File  
Grüße Uwe
Member: makaroni
makaroni Jan 07, 2015 at 09:17:07 (UTC)
Goto Top
Ganz komisch, die Lösung hatte ich auch schon getestet allerdigns kommt dann immer

2014-12-22 00:00:01 10 10.1.1.1 200 TCP_HIT 1 1 GET http www.test.de/ 80 /styles/1.png Microsoft.PowerShell.Commands.Internal.Format.FormatStartData Microsoft.PowerShell.Commands.Internal.Format.GroupStartData Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData

...

Also er setzt für jeden User Microsoft.PowerShell.Commands.Internal.Format.FormatStartData und nicht den User...

Try {
$all = @() 
$all += Get-ADGroupMember -Recursive $AD_Group -Server $Server -Credential $cred
$all += Get-ADGroupMember $AD_Group -Server $Server -Credential $cred | ?{$_.objectClass -eq "group"} | Get-ADGroupMember -Recursive   
$all = $all | select -Unique 
$all = $all | ft name
$fester_teil="2014-12-22 00:00:01 10 10.1.1.1 200 TCP_HIT 1 1 GET http www.test.de/ 80 /styles/1.png "   
$Dynamischer_teil=$all 
$fester_Teil + $dynamischer_teil | out-file $Output_File -append 
}
Catch [system.exception] {

	$Server, $AD_Group, $AD_User, $Output_File | out-file -filepath "\\pfad" -Append  

	}
	
Member: makaroni
makaroni Jan 07, 2015 at 09:20:14 (UTC)
Goto Top
Danke Uwe face-smile
Member: makaroni
makaroni Jan 07, 2015 at 09:22:45 (UTC)
Goto Top
Hey Uwe,

in der Textdatei schneidet der allerdings nach der 200 ab


2014-12-22 00:00:01 10 10.1.1.1 200 ...

Grüße
Member: colinardo
colinardo Jan 07, 2015 updated at 09:32:06 (UTC)
Goto Top
Zitat von @makaroni:
in der Textdatei schneidet der allerdings nach der 200 ab
oh sorry hatte ich auf die schnelle vergessen, ist oben korrigert face-wink

zur Info: wenn du die Tabellenüberschriften nicht brauchst, hilft der Parameter -HideTableHeaders bei ft
Member: makaroni
makaroni Jan 07, 2015 at 09:53:17 (UTC)
Goto Top
Danke, gut zu wissen. Aber ich benötige noch einmal deine Hilfe. Eigentlich dachte ich, dass ich es dank dem Beispiel nun alleine hinbekommen würde aber naja ;)

Und zwar folgendes, vorne das Datum soll das aktuelle get-date Minus 15 Tage sein. nach dem dynamischen Text, soll ein weiterer Konstanter Text hinzugefügt werden. Und zu guter Letzt, oben im Header soll ein Text stehen. Ich hoffe ich habe es erklären können was ich vorhabe?

Du hast oben mit einem Label gearbeitet oder? Wie füge ich denn in einem Label eine Variable ein? Wie erstelle ich ein zweites Label etc. face-smile

Grüße
Member: colinardo
Solution colinardo Jan 07, 2015 updated at 10:32:24 (UTC)
Goto Top
Das was ich oben gemacht habe nennt sich Calculated Property
D.h. damit fügst du einem Object in der Pipeline eine weitere "richtige" Spalte hinzu. Der Wert dieser Spalte kann natürlich nicht nur konstante Strings enthalten (das e={} bedeutet Expression) sondern eben auch normale Powershell-Befehle, alles was dort ausgegeben wird wird später der Wert der Spalte für jede Zeile, d.h. diese lässt sich auch dynamisch je nach User gestallten.
Von diesen Calculated Properties kannst du auch mehrere hinzufügen, einfach mit Komma voneinander trennen
Die Reihenfolge der Spalten kannst du dann mit ft festlegen. Den Spaltennamen kannst du schon in der Calculated Property festlegen (n="Konstante")
Für dein Beispiel:
$all | select -Unique | select Name, @{n='Konstante';e={"$((get-date (get-date).AddDays(-15) -Format "yyyy-MM-dd HH:mm:ss")) 10 10.1.1.1 200 TCP_HIT 1 1 GET http www.test.de/ 80 /styles/1.png"}}, @{n='Konstante2';e={"Irgendwas anderes"}} | ft Konstante,Name, Konstante2 -AutoSize | out-string -width 10000 | Out-File $Output_File  
Grüße Uwe
Member: makaroni
makaroni Jan 07, 2015 updated at 11:45:46 (UTC)
Goto Top
Alles klar, das habe ich verstanden.

Mit Select wähle ich ja die unter Attribute Editor verwendeten Attribute aus. Mit name klappt das, allerdings nicht mit cn oder anderen Attributen...
Oder schaue ich da falsch? Ich möchte jetzt zb nach name, cn, givenName filtern....

Des Weiteren wie kann ich einen Header einbauen. Variable in dem Try catchblock anhängen, dann würde der header ja so oft ausgegeben, soviele Nutzer es gibt.. face-smile

Grüße S
Member: colinardo
colinardo Jan 07, 2015 updated at 11:08:34 (UTC)
Goto Top
Zitat von @makaroni:
Mit Select wähle ich ja die unter Attribute Editor verwendeten Attribute aus.
Du sprichst in Rätseln was für einen Attribut-Editor ? na egal ...

Mit name klappt das, allerdings nicht mit cn oder anderen Attributen...
Oder schaue ich da falsch? Ich möchte jetzt zb nach name, cn, givenName filtern....
Mit Select wählst du die Spalten bzw. Eigenschaften aus welche du erst mal grob haben möchtest. Filtern kannst du indem du einfach noch ein Where-Object vorschaltest
$all | select -Unique | ?{$_.givenName -like '*Meier*'} | select Name,..........  

Des Weiteren wie kann ich einen Header einbauen. Variable in dem Try catchblock anhängen, dann würde der header ja so oft ausgegeben, soviele Nutzer es gibt.. face-smile
Du sprichst wieder in Rätseln...poste doch einfach mal die gewünschte Ausgabe, damit die Rätselstunde hier endlich ein Ende hat!
Member: makaroni
makaroni Jan 07, 2015 updated at 15:25:38 (UTC)
Goto Top
Sorry dafür.

So soll die Ausgabe aussehen....


..
Member: colinardo
colinardo Jan 07, 2015 updated at 11:17:31 (UTC)
Goto Top
Zitat von @makaroni:
So soll die Ausgabe aussehen....
bitte in Codetags, so ist das nutzlos... !!

versucht da etwa einer ein Webserver-Log zu fälschen ?? Dann bin ich hier nämlich raus ...
Member: makaroni
makaroni Jan 07, 2015 at 11:53:17 (UTC)
Goto Top
Nope, das war gerade ein Beispiel was ich gerade an der Hand hatte. Aber Du hast Recht, das ist ein Webserver-Log.


Ich möchte gerne in der Textdatei stehen haben:

Herzlich Wilkommen.


Uhrzeit: Benutzername test\test test\CN=Internet-TEST hat sich zu dem Zeitpunkt: xx angemeldet...

Und dann halt alles Benutzer aufgezählt. Hat den Nutzen, dass irgendwann die Onlinezeit bzw. PC-Zeit erfasst werden soll. Sprich wie lange der User X angemeldet ist.
Member: colinardo
colinardo Jan 07, 2015 updated at 12:23:35 (UTC)
Goto Top
So letzte Wohltat für heute ...
$Output_File = "\\pfad"  
$all = @() 
$text = @()
$all += Get-ADGroupMember -Recursive $AD_Group -Server $Server -Credential $cred
$all += Get-ADGroupMember $AD_Group -Server $Server -Credential $cred | ?{$_.objectClass -eq "group"} | Get-ADGroupMember -Recursive   

$text += "Herzlich Willkommen`r`n"  
$all | select -Unique | %{$text += ((get-date (get-date).AddDays(-15) -Format "yyyy-MM-dd HH:mm:ss") + " " + $_.SamAccountName + ' test\test test\CN=Internet-TEST hat sich zu dem Zeitpunkt: ' + (get-aduser $_.SamAccountName -Properties LastLogonDate).LastLogonDate + ' angemeldet')}  
$text | Out-File $Output_File
Viel Erfolg noch... der Thread ist ja ansonsten abgehandelt.
Grüße Uwe

Ansonsten siehe:

Powershell Grundlagen- und Praxisvermittlung: