goodbytes
Goto Top

PowerShell - Werte werden nicht ausgegeben und Formatierung Ausgabe

Hallo,
diese Abfrage im PS-Fenster (Windows PowerShell ISE)...
Import-Module ActiveDirectory
Get-ADComputer -ldapfilter "((name=*))" -Properties Location  | Where-Object {$_.Location -eq "TEST"} | select name,description,macaddress,location | format-list  

...gibt im PS-Fenster dieses Ergebnis zurück:
name        : PC-001
description : 
macaddress  : {}
location    : Test

Die gleiche Abfrage, nur mit Umleitung in eine Datei...
Import-Module ActiveDirectory
Get-ADComputer -ldapfilter "((name=*))" -Properties Location  | Where-Object {$_.Location -eq "TEST"} | select name,description,macaddress,location | Export-CSV C:\Users\Administrator.FOOD-SRV001.001\Desktop\PS-Test.txt | format-list  

...gibt in der Datei das aus:
#TYPE Selected.Microsoft.ActiveDirectory.Management.ADComputer
"name","description","macaddress","location"  
"BIOS-NB012",,"Microsoft.ActiveDirectory.Management.ADPropertyValueCollection","Test"  

Nun verwundert es mich, dass einige Werte nicht angezeigt werden, die aber definitiv hinterlegt sind (Beschreibung und MAC-Adresse). Woran kann das liegen?
Eine Frage noch zur Formatierung. Ist es möglich die Ausgabe in eine Datei so zu formatieren, dass die Ausgabe der Attribute pro Objekt in einer Zeile mit Trennzeichen ";" getrennt ausgegeben werden?
Solch eine Ausgabe in eine Datei meine ich:
PC-001;Meine Beschreibung;40-16-7E-A7-1C-06;Test
PC-002;Meine Beschreibung;34-17-EB-9F-E1-53;Test

(Dieser Beitrag beruht auf meinem vorherigen Beitrag vom gestrigen Tage: AD-Abfrage Attribute mittels Batch.)

Gruß
Torsten

Content-Key: 285747

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

Printed on: April 24, 2024 at 11:04 o'clock

Member: colinardo
Solution colinardo Oct 16, 2015, updated at Oct 27, 2015 at 10:17:29 (UTC)
Goto Top
Moin Torsten,
also ich habe hier in den Computer-Objekten kein solch ein Attribut MacAddress, habt Ihr das dem AD-Schema hinzugefügt ? Zusätzlich musst du die zusätzlich abzufragenden Properties auch explizit angeben oder -Properties * verwenden um alle abzufragen, sonst werden sie nicht mit aufgelistet und nur ein paar Default-Werte abgefragt!

Manche Objekte muss man hier auch manchmal expandieren wenn sie nicht als String ausgegeben werden:
Import-Module ActiveDirectory
Get-ADComputer -Filter * -Properties *  | ?{$_.Location -eq "TEST"} | select name,description,@{n="macaddress";e={$_.macaddress.toString()}},location | Export-CSV "C:\Users\Administrator.FOOD-SRV001.001\Desktop\PS-Test.txt" -NoType -Delimiter ";" -Encoding UTF8  
Eine Frage noch zur Formatierung. Ist es möglich die Ausgabe in eine Datei so zu formatieren, dass die Ausgabe der Attribute pro Objekt in einer Zeile mit Trennzeichen ";" getrennt ausgegeben werden?
Ist in meinem Code selbstverständlich schon umgesetzt face-wink -NoType entfernt die Typeninfo , -Delimiter setzt das Trennzeichen, und -Encoding UTF8 sorgt dafür das Sonderzeichen und Umlaute korrekt in die Datei wandern.

Grüße Uwe

p.s. die ISE hat Parameter IntelliSense und Parametervervollständigung, einfach mal ausprobieren...dann siehst du welche Parameter ein Befehl aktzeptiert.
Member: goodbytes
goodbytes Oct 20, 2015 updated at 14:22:14 (UTC)
Goto Top
Hallo Uwe,
das funktioniert tatsächlich bestens. Das Attribut macAddress hab ich im AD-Schema zusätzlich aktiviert.
Aber weshalb wird dieser String nicht angezeigt? Es kommt nur: "Microsoft.ActiveDirectory.Management.ADPropertyValueCollection".
Wenn ich es richtig sehe müsste ich den gewüschten String irgendwie aus der Collection, die ja ein Array ist, extrahieren, oder? Aber wie?

Eine Frage noch, kann ich die erste Zeile mit den Attributbezeichnungen irgendwie in der Ausgabe unterdrücken?
Member: colinardo
Solution colinardo Oct 20, 2015, updated at Oct 21, 2015 at 08:21:06 (UTC)
Goto Top
Zitat von @goodbytes:
Aber weshalb wird dieser String nicht angezeigt? Es kommt nur: "Microsoft.ActiveDirectory.Management.ADPropertyValueCollection".
Wenn ich es richtig sehe müsste ich den gewüschten String irgendwie aus der Collection, die ja ein Array ist, extrahieren, oder? Aber wie?
Bin gerade auf Dienstreise und kein Zugriff auf mein TestAD. Aber versuchs mal so
Import-Module ActiveDirectory
Get-ADComputer -Filter * -Properties *  | ?{$_.Location -eq "TEST"} | select name,description,@{n="macaddress";e={$_.macaddress -join ","}},location | Export-CSV "C:\Users\Administrator.FOOD-SRV001.001\Desktop\PS-Test.txt" -NoType -Delimiter ";" -Encoding UTF8  

Bin leider erst nächste Woche wieder voll einsatzbereit face-wink
Eine Frage noch, kann ich die erste Zeile mit den Attributbezeichnungen irgendwie in der Ausgabe unterdrücken?
Meinst du die Überschriften der Spalten ? Denn die Typeninformationen werden schon durch den Parameter -NoType unterdrückt, das hatte ich schon.Berücksichtigt!

Möchtest du hingegen die Überschriften der Spalten nicht geht das so:
Import-Module ActiveDirectory
Get-ADComputer -Filter * -Properties *  | ?{$_.Location -eq "TEST"} | select name,description,@{n="macaddress";e={$_.macaddress -join ","}},location | ConvertTo-CSV -NoType -Delimiter ";" -Encoding UTF8 | select -skip 1 | Set-Content "C:\Users\Administrator.FOOD-SRV001.001\Desktop\PS-Test.txt" -UTF8  
Member: goodbytes
goodbytes Oct 21, 2015 at 07:30:09 (UTC)
Goto Top
Guten Morgen Uwe,
was soll ich sagen - es funktioniert perfekt! face-smile

Ich musste lediglich das -Encoding UTF8 weiter hinten anhängen und dann ging es auf Anhieb.
Import-Module ActiveDirectory
Get-ADComputer -Filter * -Properties *  | ?{$_.Location -eq "R41"} | select name,@{n="macaddress";e={$_.macaddress -join ","}},description | ConvertTo-CSV -NoType -Delimiter ";" | select -skip 1 | Set-Content "C:\Users\Administrator.FOOD-SRV001.001\Desktop\psexec_list.txt" -Encoding UTF8  

Vielen Dank für deine Hilfe !!! face-smile face-smile face-smile
Als Nächstes werde ich zusehen wie ich meine mac-Adressen aus meiner csv-Liste (Computername;mac-Adresse), welche im Netzwerk per Task automatisch erstellt wird, in das Attribut macAddress schreibe, damit diese Information für die Verwendung dann im AD vorliegt.

Wie gesagt, vielen Dank Uwe, du hast mir wieder einmal sehr geholfen !!! face-smile

Gruß
Torsten
Member: goodbytes
goodbytes Oct 22, 2015 updated at 14:07:19 (UTC)
Goto Top
Eine Frage hab ich nun aber doch noch.
Ich lasse den PowerShell-Aufruf innerhalb der Batch laufen.
@echo off

more +8 %0 | powershell -command -

echo Rest der Batch...
exit

:: PS-Funktion
Function Get-Test {
  param()
  Begin{
    Write-Host "Starte PowerShell..."   
  }
  Process{
	Import-Module ActiveDirectory
	Get-ADComputer -Filter * -Properties *  | ?{$_.Location -eq "Test"} | select name,@{n="macaddress";e={$_.macaddress -join ","}},description | ConvertTo-CSV -NoType -Delimiter ";" | select -skip 1 | Set-Content "C:\mac-list.txt" -Encoding UTF8  
	}
  End{
   Write-Host "Beende PowerShell..."  
  }
}
Get-Test

exit

Wie kann ich dem PowerShell-Aufruf statt der Location "Test" an der Stelle den Inhalt einer Variablen der Batch übergeben? Ich möchte die Batch aufrufen und den Standort als String an die Batch übergeben, darin dann natürlich für die Abfrage des AD an den PowerShell-Aufruf.

Gruß
Torsten
Member: colinardo
Solution colinardo Oct 22, 2015, updated at Oct 27, 2015 at 10:17:33 (UTC)
Goto Top
Ich mach das immer so ...
@echo off
set "location=Lager"  
Powershell -ExecutionPolicy ByPass -command "&{Import-Module ActiveDirectory; Get-ADComputer -Filter * -Properties *  | ?{$_.Location -eq '%location%'} | select name,@{n='macaddress';e={$_.macaddress -join ','}},description | ConvertTo-CSV -NoType -Delimiter ';' | select -skip 1 | Set-Content 'C:\mac-list.txt' -Encoding UTF8}"  

Grüße Uwe
Member: goodbytes
goodbytes Oct 22, 2015 updated at 15:13:11 (UTC)
Goto Top
Also kann ich den PS-String nicht in einen eigenen Abschnitt stecken und
mittels "more +8 %0 | powershell -command - " aufrufen, weil ich die Variable nicht in den String bekomme...

Wenn ich den Code von dir so ausführe bekomme ich aber einen Fehler zurück:
Fehlender Ausdruck nach dem un„ren Operator ",".  

Bei Zeile:1 Zeichen:155
+ &{Import-Module ActiveDirectory; Get-ADComputer -Filter * -Properties *  | ?{
$_.Location -eq 'Test'} | select name,@{n=macaddress;e={$_.macaddress -join , <  
<<< }},description | ConvertTo-CSV -NoType -Delimiter ';' | select -skip 1 | Se  
t-Content 'C:\mac-list.txt' -Encoding UTF8}  

    + CategoryInfo          : ParserError: (,:String) , ParentContainsErrorR 
   ecordException
    + FullyQualifiedErrorId : MissingExpressionAfterOperator
 

Gruß
Torsten

Ach so, kann man eigentlich die Ausgabe der Anführungszeichen in die Exportdatei irgendwie unterdrücken?
Member: colinardo
Solution colinardo Oct 22, 2015, updated at Oct 27, 2015 at 10:17:37 (UTC)
Goto Top
Zitat von @goodbytes:

Also kann ich den PS-String nicht in einen eigenen Abschnitt stecken und
mittels "more +8 %0 | powershell -command - " aufrufen, weil ich die Variable nicht in den String bekomme...
Solltest du wie oben auch einfach mit der Variablen machen können. Variable einsetzen wird ja dann beim parsen derr Batch im Code ersetzt.
Mache das halt lieber als Einzeiler face-wink
Wenn ich den Code von dir so ausführe bekomme ich aber einen Fehler zurück:
Hatte noch einen kleinen Fehler drin sorry ... ist oben korrigiert.
Ach so, kann man eigentlich die Ausgabe der Anführungszeichen in die Exportdatei irgendwie unterdrücken?
Kann man... Sei aber gewarnt: Wenn du in deinen Daten ein Semikolon drin haben solltest bekommst du natürlich Probleme ! Die haben schon ihren Zweck, gerade wenn man ein Feld mit den Namen "Description" exportiert!
(Get-ADComputer -Filter * -Properties * | ?{$_.Location -eq 'Test'} | select name,@{n='macaddress';e={$_.macaddress -join ','}},description | ConvertTo-CSV -NoType -Delimiter ';' | select -skip 1) -replace '"','' | Set-Content 'C:\mac-list.txt' -Encoding UTF8   
Member: goodbytes
goodbytes Oct 23, 2015 updated at 07:43:54 (UTC)
Goto Top
Hallo Uwe,
der PowerShell-Aufruf als Einzeiler in der Batch funktioniert jetzt tadellos. Mit dem -replace schlägt es allerdings fehl.

set "location=Test"  
Powershell -ExecutionPolicy ByPass -command "&{Import-Module ActiveDirectory; (Get-ADComputer -Filter * -Properties *  | ?{$_.Location -eq '%location%'} | select name,@{n='macaddress';e={$_.macaddress -join ','}},description | ConvertTo-CSV -NoType -Delimiter ';' | select -skip 1) -replace '"','' | Set-Content 'C:\mac-list.txt'}"  

Ein ";" ist in den Attributen definitiv nicht enthalten, da achte ich ohnehin drauf. Von der Seite her gibt es keine Probleme.

Gruß
Torsten
Member: colinardo
Solution colinardo Oct 23, 2015, updated at Oct 27, 2015 at 10:17:38 (UTC)
Goto Top
Meine letzte Codezeile war ja nicht für den Einzeiler optimiert. Dort musst du das das doppelte Anführungszeichen mit einem Backslash escapen face-wink weil die Gänsefüßchen ja schon den gesamten Code umschließen!

- replace '\"',''
Grüße Uwe
Member: goodbytes
goodbytes Oct 23, 2015 updated at 09:07:45 (UTC)
Goto Top
In der ISE läuft es so sauber durch:
Import-Module ActiveDirectory; (Get-ADComputer -Filter * -Properties *  | ?{$_.Location -eq 'Test'} | select name,@{n='macaddress';e={$_.macaddress -join ','}},description | ConvertTo-CSV -NoType -Delimiter ';' | select -skip 1) -replace '\"','' | Set-Content 'C:\mac-list.txt'  

In der Batch (als Einzeiler) allerdings nicht, kommt auch keine Fehlermeldung:
set "location=Test"  
Powershell -ExecutionPolicy ByPass -command "&{Import-Module ActiveDirectory; (Get-ADComputer -Filter * -Properties *  | ?{$_.Location -eq '%location%'} | select name,@{n='macaddress';e={$_.macaddress -join ','}},description | ConvertTo-CSV -NoType -Delimiter ';' | select -skip 1) -replace '\"','' | Set-Content 'B:\001 - BACKUP\Images\Snapshot\Script\mac-list.txt'}"  
An der Variable "%location%" liegt es aber nicht, als Einzeiler funktioniert es auch nicht mit einem festen String.

Gruß
Torsten

Edit...
Als Funktion mittels "more" wird allerdings der Wert der Variable "%location%" nicht übernommen, das funktioniert nur im Einzeiler.
Member: colinardo
Solution colinardo Oct 23, 2015, updated at Oct 27, 2015 at 10:17:41 (UTC)
Goto Top
In der Batch (als Einzeiler) allerdings nicht, kommt auch keine Fehlermeldung:
Geht hier im Test einwandfrei ... Welche PS Version ?
Member: goodbytes
goodbytes Oct 23, 2015 at 20:55:03 (UTC)
Goto Top
Die PS-Version 2 ist drauf.
Member: goodbytes
goodbytes Oct 27, 2015 at 09:00:36 (UTC)
Goto Top
So, nun hab ich die Version 4 installiert. Beim Aufruf der Batch bricht sie sofort ab, ohne dass ich etwas erkennen kann.
set "Raum=Test"  
Powershell -ExecutionPolicy ByPass -command "&{Import-Module ActiveDirectory; (Get-ADComputer -Filter * -Properties * | ?{$_.Location -eq '%Raum%'} | select name,@{n='macaddress';e={$_.macaddress -join ','}},description | ConvertTo-CSV -NoType -Delimiter ';' | select -skip 1) -replace '\"','' | Set-Content 'C:\mac-list.txt'}"  
Auch wenn ich statt '%Raum%' den String '"Test"' einsetze geht es nicht... Wo ist da nur der Fehler?

Gruß
Torsten
Member: colinardo
Solution colinardo Oct 27, 2015 updated at 10:20:36 (UTC)
Goto Top
Wo ist da nur der Fehler?
Da Fehlt ein ^ vor der letzten Pipe
@echo off
set "raum=Test"  
Powershell -ExecutionPolicy ByPass -command "Import-Module ActiveDirectory; (Get-ADComputer -Filter * -Properties * | ?{$_.Location -eq '%raum%'} | select name,@{n='macaddress';e={$_.macaddress -join ','}},description | ConvertTo-CSV -NoType -Delimiter ';' | select -skip 1) -replace '\"','' ^| set-content -Path 'C:\maclist.txt'"  
pause
Member: goodbytes
goodbytes Oct 27, 2015 at 10:17:15 (UTC)
Goto Top
Ah, das hab ich völlig übersehen...
Jetzt läuft es bestens, vielen vielen Dank für deine Geduld, Uwe !!! face-smile

Gruß
Torsten