lorsumalpha
Goto Top

Active Directory: Filterung mithilfe von Powershell

Moin,
aktuell schreibe ich ein Script, welches mir die AD-User ausgibt, welche in einer bestimmten Gruppe sind, diese wird zudem auch ausgegeben.
Nun möchte ich weitere Attribute hinzufügen, z.B. DistinguishedName. Jetzt haut er mir Fehlermeldungen rein und so ganz kann ich diese nicht interpretieren.
$dat = @(Get-ADGroup -Filter "name -like 'DL-Computer-*'" -PipelineVariable group | Get-ADGroupMember | select @{n='UserName';e={$_.name}},@{n='GroupName';e={$group.name}})  

$dat | select UserName -Unique | ForEach-Object {
    $usrgrp = @($dat | where username -eq $_.UserName | sort GroupName);
    # Write-Host $_.UserName;
    $DistinguishedName = @($dat | Get-ADUser -filter {Name -like $_.UserName} -properties DistinguishedName | Select DistinguishedName);
    [pscustomobject]@{
        UserName=$_.Username;
        Group1=$usrgrp.GroupName;
        Group2=$usrgrp[1].GroupName;
        Group3=$usrgrp[2].GroupName;
        DistinguishedName = $DistinguishedName;
        #DistinguishedName= Get-ADUser -filter {Name -like $_.Username} -properties DistinguishedName | Select DistinguishedName
    };
}

Die Fehlermeldung lautet:
Get-ADUser : Eigenschaft "UserName" wurde im Objekt vom Typ   
"System.Management.Automation.PSCustomObject" nicht gefunden.  
In Zeile:7 Zeichen:35
+ ...  = @($dat | Get-ADUser -filter {Name -like $_.UserName} -properties D ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-ADUser], ArgumentException
    + FullyQualifiedErrorId : ActiveDirectoryCmdlet:System.ArgumentException,Microsoft. 
   ActiveDirectory.Management.Commands.GetADUser

Mache ich grundsätzlich etwas falsch?
LG Christian

Content-ID: 3686265800

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

Ausgedruckt am: 22.11.2024 um 13:11 Uhr

ElCativoGER
ElCativoGER 18.08.2022 um 09:25:09 Uhr
Goto Top
Moin.

Bin mir nicht sicher... aber stimmt die Zeile?

 UserName=$_.Username;

muss es nicht heissen:

 Username=$_.Username;

Gruß
Alex
rzlbrnft
rzlbrnft 18.08.2022 aktualisiert um 09:34:09 Uhr
Goto Top
Bin mir jetzt nicht ganz sicher, aber meines Erachtens pipest du nicht das eigentliche Objekt, sondern den Text, den du in der Variable $dat gespeichert hast, das hat dann natürlich keine Eigenschaft Username mehr.

Probiers mal ohne die Variable, indem du den Befehl direkt an das foreach Objekt durchpipest.

Powershell ist btw. größtenteils case-insensitive.
lorsumalpha
lorsumalpha 18.08.2022 um 09:38:20 Uhr
Goto Top
Zitat von @rzlbrnft:

Bin mir jetzt nicht ganz sicher, aber meines Erachtens pipest du nicht das eigentliche Objekt, sondern den Text, den du in der Variable $dat gespeichert hast, das hat dann natürlich keine Eigenschaft Username mehr.

Probiers mal ohne die Variable, indem du den Befehl direkt an das foreach Objekt durchpipest.

Powershell ist btw. größtenteils case-insensitive.

Moin,
kann sein das ich aktuell auf dem Schlauch stehe, könntest du mir eventuell das ein wenig genauer erklären
rzlbrnft
rzlbrnft 18.08.2022 aktualisiert um 09:43:48 Uhr
Goto Top
Habs mir jetzt nochmal genauer angeschaut. Wo definierst du denn was pscustomobject überhaupt ist?
Das muss ja irgendwo beschrieben und mit Daten befüllt werden.

$myObject = [PSCustomObject]@{
Name = 'Kevin'
Language = 'PowerShell'
State = 'Texas'
}

Inhalt von $myObject.Name ist dann Kevin.
lorsumalpha
lorsumalpha 18.08.2022 um 09:49:41 Uhr
Goto Top
Zitat von @rzlbrnft:

Habs mir jetzt nochmal genauer angeschaut. Wo definierst du denn was pscustomobject überhaupt ist?
Das muss ja irgendwo beschrieben und mit Daten befüllt werden.

$myObject = [PSCustomObject]@{
Name = 'Kevin'
Language = 'PowerShell'
State = 'Texas'
}

Inhalt von $myObject.Name ist dann Kevin.

Achso so meinst du das, ich habe das Script bzw. die Aufgabe dahinter bekommen, der vorherige Status, bevor ich daran etwas gemacht hatte, war folgender:

$dat = @(Get-ADGroup -Filter "name -like 'DL-Computer-*'" -PipelineVariable group | Get-ADGroupMember | select @{n='UserName';e={$_.name}},@{n='GroupName';e={$group.name}})  



$dat | select UserName -Unique | ForEach-Object {
    $usrgrp = @($dat | where username -eq $_.UserName | sort GroupName);
    [pscustomobject]@{
        UserName=$_.Username;
        Group1=$usrgrp.GroupName;
        Group2=$usrgrp[1].GroupName;
        Status="Enabled";  
        DistinguishedName="Test";  
        LastLogon="Today";  
    };
}

Aktuell bin ich gerade am Powershell Erlernen, als Teil meiner Ausbildung; so ganz kann ich also mit manchen Begriffen nichts anfangen direkt - Soweit ich das Script aber durchgeguckt habe, befüllt erst Oben der Filter die Spalte für den UserName und in der ForEach Schleife werden dann die GroupNames eingefügt.
rzlbrnft
Lösung rzlbrnft 18.08.2022 um 10:05:43 Uhr
Goto Top
Also pscustomobject ist ein Objekt, dem du einen Namen geben musst, erst dann kannst du die dafür definierten Eigenschaften aufrufen. Du müsstest also z.B. $Benutzerdaten = [pscustomobject] mit den dazu gehörigen Eigenschaften definieren, dann kannst du es mit $Benutzerdaten.Eigenschaft wieder ausgeben.
Für deine Anforderung brauchst du das aber gar nicht. Die Formatierung kannst du doch schon im select machen.

Get-ADGroup -Filter "name -like '*DL-Computer*'" -PipelineVariable group | Get-ADGroupMember | select @{n='UserName';e={$_.name}},@{n='GroupName';e={$group.name}},@{n='DistinguishedName';e={$_.DistinguishedName}}
rzlbrnft
rzlbrnft 18.08.2022 um 10:25:37 Uhr
Goto Top
Da es mich selber interessiert hat, so wär die Schreibweise mit pscustomobject, Name scheint man doch nicht zu brauchen, ist aber ein bisschen langsamer als select.

Get-ADGroup -Filter "name -like '*DL*'" -PipelineVariable group | Get-ADGroupMember | ForEach {
[pscustomobject]@{
Name = $_.Name
DistinguishedName = $_.DistinguishedName
GroupName = $group.name
}
}