PowerShell: Sort-Object in PSSession

Squicky

Lt. Commander
Registriert
Sep. 2002
Beiträge
1.422
Hallo

ich habe hier ein kleines Beispiel geschrieben um das Fehlerverhalten zu zeigen:

Code:
$ErrorActionPreference = 'Stop'

Import-Module ActiveDirectory

$AdUsers = Get-ADUser -Filter * | Select Name, SID

Write-Output "unsorted" > C:\temp\unsorted.txt

foreach($user in $AdUsers) {

	[string]$sid = $user.Sid.Value

	Write-Output $sid >> C:\temp\unsorted.txt
}
	
$AdUsers_sorted1 = $AdUsers | Sort-Object -Property Sid

Write-Output "sorted1" > C:\temp\sorted1.txt

foreach($user in $AdUsers_sorted1) {

	[string]$sid = $user.Sid.Value

	Write-Output $sid >> C:\temp\sorted1.txt

}

$Session = New-PSSession -ComputerName "localhost"

# Komma vor $AdUsers hinzugefügt:
Invoke-Command -Session $Session -ArgumentList ( , $AdUsers) -ScriptBlock {
	Param($AdUsers)
			
	$AdUsers_sorted2 = $AdUsers | Sort-Object -Property Sid

	Write-Output "sorted2" > C:\temp\sorted2.txt

	foreach($user in $AdUsers_sorted2) {

		[string]$sid = $user.Sid.Value

		Write-Output $sid >> C:\temp\sorted2.txt

	}
}

In den Ordner C:\temp werden drei txt Dateien erstellt:

1. unsorted.txt
eine unsortierte Liste aller User Sid aus dem ActiveDirectory

2. sorted1.txt
eine sortierte Liste aller User Sid aus dem ActiveDirectory (Sortierung ist richtig)

3. sorted2.txt
eine falsch sortierte Liste aller User Sid aus dem ActiveDirectory


Eigentlich sollten die zwei Liste in sorted1.txt und sorted2.txt gleich sein.
Der Sort-Object Befehl im Session ScriptBlock wird angewendet, den die Listen in unsorted.txt und sorted2.txt sind unterschiedlich.

Warum sind die Sid Listen in sorted1.txt und sorted2.txt nicht gleich? :confused_alt:

Danke
 
Zuletzt bearbeitet:
Das Problem scheint zu sein, dass statt dem ganzen Objekt nur ein Eintrag (der erste aus unsorted) mit $AdUsers übergeben wird.

guck grad wie man des object richtig übergeben muss.

Edit: Übergabe als Array funktioniert mit Komma davor

Code:
Invoke-Command -Session $Session -ArgumentList (,$AdUsers) -ScriptBlock

sortierung geht dann aber iwie anders
 
Zuletzt bearbeitet:
Ich vermute mal, dass die Sortierung mit Invoke-Command nicht nach SID.Value im Standard sortiert.
Wie du ja selbst weißt hängt hinter der Eigenschaft SID nicht nur der Value.

Workaround:

$AdUsers = Get-ADUser -Filter * | Select Name , @{n='SID'; e= {$_.SID.value}}
und statt [string]$sid = $user.Sid.Value -> [string]$sid = $user.Sid

Code:
$ErrorActionPreference = 'Stop'
 
Import-Module ActiveDirectory
 
$AdUsers = Get-ADUser -Filter * | Select Name , @{n='SID'; e= {$_.SID.value}}
 
Write-Output "unsorted" > C:\temp\unsorted.txt
 
foreach($user in $AdUsers) {
 
	[string]$sid = $user.Sid
 
	Write-Output $sid >> C:\temp\unsorted.txt
}
	
$AdUsers_sorted1 = $AdUsers | Sort-Object -Property Sid
 
Write-Output "sorted1" > C:\temp\sorted1.txt
 
foreach($user in $AdUsers_sorted1) {
 
	[string]$sid = $user.Sid
 
	Write-Output $sid >> C:\temp\sorted1.txt
 
}
 
$Session = New-PSSession -ComputerName "localhost"
 
# Komma vor $AdUsers hinzugefügt:
Invoke-Command -Session $Session -ArgumentList ( , $AdUsers) -ScriptBlock {
	Param($AdUsers)
			
	$AdUsers_sorted2 = $AdUsers | Sort-Object -Property Sid
 
	Write-Output "sorted2" > C:\temp\sorted2.txt
 
	foreach($user in $AdUsers_sorted2) {
 
		[string]$sid = $user.Sid
 
		Write-Output $sid >> C:\temp\sorted2.txt
 
	}
}
 
@DPXone
Danke für den Workaround :)


Die Frage bleibt aber:
Warum funkioniert das Sortieren
Code:
$AdUsers_sorted2 = $AdUsers | Sort-Object -Property Sid
im Invoke-Command nicht?
Bzw. warum funkioniert es anders?

:(
 
Sehr gute Frage.
Hab gestern auch beim testen kurz aufgegeben weil eben der Befehlt

Code:
    $AdUsers_sorted2 = $AdUsers | Sort-Object -Property Sid
auch nicht mehr wollte. da bin ich kurz vom Glauben abgefallen und hab aufgegeben^^
 
Zurück
Oben