alex.k
Goto Top

Get-ADobject Variable nicht definiert?

Hallo zusammen,

ich habe ein nerviges Problem mit einem von mir geschriebenen PowerShell Script bzw. nur mit einem Teil davon. Ich hoffe, dass mir da jemand weiterhelfen kann.

In dem Teil von dem Script geht es darum, dass ich einen AD-User wiederherstelle, nachdem er gelöscht wurden.

AD-Server = Windows Server 2019
Exchange-Server = Windows Server 2019

Das Gesamte Script ist zu lange. Daher habe ich nur den Teil, um den es geht, eingefügt. Daher noch die zusätzliche Information, dass im Vorfeld für die Exchange und AD Cmdlet´s die passenden Module geladen werden. Die AD-Module für PowerShell habe ich vorher auf dem Exchange und AD-Server installiert.

            
Write-Host -ForegroundColor Cyan "`n`nUser Wiederherstellen"  
"`nDieser Vorgang kann je nach Anzahl der gelöschten User etwas dauern!"  
$deleteed = Get-ADObject -Filter {(isdeleted -eq $true)} -IncludeDeletedObjects -Properties *
                    
for($i = 1;$i -le $deleteed.count; $i++)
{
    Write-Progress -Activity "Gelöschte User werden gesucht" -PercentComplete (($i*100)/$deleteed.count)   
    Write-host "User $($deleteed[$i-1].Samaccountname) ermittelt"  
}
                    
if($deleteed.count -ge 1)
{
    $san = Read-Host "SamAccountName eingeben"  

    do
    {
        if($san -like "Cancel")  
        {
            break mainja;
        }

        elseif($deleteed.Samaccountname -notcontains $san)
        {
            do
            {
                if($san -like "Cancel")  
                {
                    break mainja;
                }

                if(-not $san)
                {
                    Write-Warning "Sie haben keine User eingegeben"  
                    $san = Read-Host "SamAccountName eingeben"  
                    break
                }

                elseif($deleteed.Samaccountname -notcontains $san)
                {
                    Write-Warning "User kann nicht gefunden werden"  
                    $san = Read-Host "SamAccountName eingeben"  
                    break
                }
            }until($deleteed.Samaccountname -contains $san)
        }

        if($deleteed.Samaccountname -contains $san)
        {
            Get-ADObject -Filter {samaccountname -eq $san} -IncludeDeletedObjects | Restore-ADObject
            Write-Host "`nUser $san wurde wiederhergestellt`n"  
        }
    }until($deleteed.SamAccountName -contains $san)
}

else
{
    Write-Host "`n`nEs wurden keine gelöschten User gefunden"  
}

Wenn ich das Script ausführe, bekomme ich folgende Fehlermeldung:

Variable: "san" wurde im Ausdruck gefunden: $san ist nicht definiert.  
    + CategoryInfo          : InvalidArgument: (:) [Get-ADObject], ArgumentException
    + FullyQualifiedErrorId : ActiveDirectoryCmdlet:System.ArgumentException,Microsoft.ActiveDirectory.Management.Commands.GetADObject
    + PSComputerName        : DC01

Das komische ist das ich die Fehlermeldung eben nicht immer bekomme. Gestern kurz vor Feierabend habe ich das Script ausgeführt und es lief auf dem Exchange als auch auf dem AD-Server ohne Probleme durch. Heute Morgen ohne überhaupt was an dem Script zu ändern, läuft das Script auf dem Exchange nicht, aber auf dem AD. Vor paar Tagen war es sogar so, dass das Problem egal auf welcher Maschine aufgetreten ist.

Ich hoffe, mir kann hier jemand weiterhelfen, ich suche nämlich schon wie blöd und finde meinen Fehler einfach nicht.

Ich danke euch und wünsche noch einen angenehmen Tag.

Gruß Alex.K
Kommentar vom Moderator Dani am 13.09.2022 um 16:40:57 Uhr
Fehlermeldung in Code Blocks gepackt.

Content-ID: 3927184089

Url: https://administrator.de/forum/get-adobject-variable-nicht-definiert-3927184089.html

Ausgedruckt am: 19.03.2025 um 12:03 Uhr

3803037559
3803037559 13.09.2022 aktualisiert um 16:47:48 Uhr
Goto Top
Moin.
Kommt hier immer mal wieder. Stichwort Variable-Scope innerhalb von Filter-Blöcken von AD CMDLets, die Variablen mögen es nicht wenn der Filter mit geschweiften Klammern geschrieben wird, darin gibt es die Variable nicht.
Mach die Abfrage mit der Variablen bei Get-ADObject so dann klappt es mit der Variablen im Filter einwandfrei
Get-ADObject -Filter "samaccountname -eq '$san'" -IncludeDeletedObjects  

Cheers
certguy
Alex.K
Alex.K 14.09.2022 um 07:01:03 Uhr
Goto Top
Zitat von @3803037559:

Moin.
Kommt hier immer mal wieder. Stichwort Variable-Scope innerhalb von Filter-Blöcken von AD CMDLets, die Variablen mögen es nicht wenn der Filter mit geschweiften Klammern geschrieben wird, darin gibt es die Variable nicht.
Mach die Abfrage mit der Variablen bei Get-ADObject so dann klappt es mit der Variablen im Filter einwandfrei
Get-ADObject -Filter "samaccountname -eq '$san'" -IncludeDeletedObjects  

Cheers
certguy

Danke für die schnelle Antwort.

Das habe ich tatsächlich am Anfang so gehabt und damit ist der fehler auch aufgetreten. Ich habe das schon in allen Variationen gehabt die ich im netzt gefunden hab. Der Fehler ist leider immer wieder aufgetreten.

Gruß Alex.k
3803037559
3803037559 14.09.2022, aktualisiert am 19.09.2022 um 10:46:23 Uhr
Goto Top
Kann ich hier nicht bestätigen.
Aber das zusätzliche Get-ADObject ist ja auch ehrlich gesagt vollkommen überflüssig (wie vieles andere im Skript auch) und Ressourcenverschwendung denn du hast das Objekt ja schon in der Variablen $deleteed (wat n Schreibfehler 🙃) vorliegen, also filtere es einfach aus statt es erneut abzufragen
$deleteed | ?{$_SamAccountName -eq $san} | Restore-ADObject

p.s. du solltest dir angewöhnen auch bei Variablen Rechtschreibfehler zu korrigieren, sonst führt das schnell zu Flüchtigkeitsfehlern...

Cheers
c.
Alex.K
Alex.K 14.09.2022 um 12:05:57 Uhr
Goto Top
Ah wusste nicht das ich das auch so machen kann. Werde es testen, allerdings komme ich erst am Montag dazu. Werde aber berichten.

Zu deiner Anmerkungen ja da hast du grundsätzlich recht. Nur mit einer Rechtschreibschwäche ist das immer leichter gesagt als getan. Und bevor ich das script rausgebe, aktuell nur für mich, werde ich eh noch einiges an dem script anpassen. Dazu gehört auch das ich den Variablen noch andere Bezeichnungen gebe. Die meisten sind vom testen entstanden und hab sie dann so übernommen. Aber wie gesagt wird das ganze so oder so nochmals überarbeitet.

P.s. noch ne kleine Anmerkung von mir. Das ist mein erstes script und auch meine ersten versuche mit PowerShell. Daher sei bitte nachsichtig face-wink

Gruß Alex.K
Alex.K
Alex.K 19.09.2022 um 10:39:43 Uhr
Goto Top
Zitat von @3803037559:

Kann ich hier nicht bestätigen.
Aber das zusätzliche Get-ADObject ist ja auch ehrlich gesagt vollkommen überflüssig (wie vieles andere im Skript auch) und Ressourcenverschwendung denn du hast das Objekt ja schon in der Variablen $deleteed (wat n Schreibfehler 🙃) vorliegen, also filtere es einfach aus statt es erneut abzufragen
$deleteed | ? SamAccountName -eq $san | Restore-ADObject

p.s. du solltest dir angewöhnen auch bei Variablen Rechtschreibfehler zu korrigieren, sonst führt das schnell zu Flüchtigkeitsfehlern...

Cheers
c.


So wie gesagt, melde ich mich zurück. Habe den Vorschlag von dir hinzugefügt und getestet. Woraufhin ich nachfolgende Fehlermeldung bekomme:

Das Eingabeobjekt kann an keine Parameter des Befehls gebunden werden, da der Befehl keine Pipelineeingaben akzeptiert oder die Eingabe und deren Eigenschaften mit keinem der Parameter übereinstimmen, die Pipelineeingaben akzeptieren.
    + CategoryInfo          : InvalidArgument: (CN=Koop1\0ADEL:...cts,DC=me,DC=me:PSObject) [Restore-ADObject], ParameterBindingException
    + FullyQualifiedErrorId : InputObjectNotBound,Microsoft.ActiveDirectory.Management.Commands.RestoreADObject
    + PSComputerName        : DC01

Eine Idee, warum die Meldung kommt?

Gruß Alex.K
3803037559
3803037559 19.09.2022 aktualisiert um 10:46:58 Uhr
Goto Top
Ja du hast irgendwo das AD Objekt zu einem Custom Object konvertiert.
Alex.K
Alex.K 19.09.2022 um 10:51:41 Uhr
Goto Top
Zitat von @3803037559:

Ja du hast irgendwo das AD Objekt zu einem Custom Object konvertiert.

nicht, dass ich wüsste, wenn ich $deleteed.GetType() eingeben bekomme ich Folgendes:

IsPublic IsSerial Name                                     BaseType                                                                                                                                                                                              
-------- -------- ----                                     --------                                                                                                                                                                                              
True     True     Object                                 System.Array

und bis auf das, was ich im ersten Post geschrieben habe, ändere ich das auch nicht ab im Verlauf des Codes.

Gruß Alex.K
3803037559
Lösung 3803037559 19.09.2022 aktualisiert um 11:07:06 Uhr
Goto Top
Scheint wohl bei manchen AD Probleme bei mehreren Restores zur gleichen Zeit zu geben, machs mal mit Foreach-Schleife
$deleteed | ?{$_.SamAccountName -eq $san}  | %{Restore-ADObject  $_.objectguid -NewName $_.samaccountname -TargetPath $_.LastKnownParent}
Alex.K
Lösung Alex.K 19.09.2022 um 11:14:12 Uhr
Goto Top
Zitat von @3803037559:

Scheint wohl bei manchen AD Probleme bei mehreren Restores zur gleichen Zeit zu geben, machs mal mit Foreach-Schleife
$deleteed | ?{$_SamAccountName -eq $san}  | %{Restore-ADObject  $_.objectguid -NewName $_.samaccountname -TargetPath $_.LastKnownParent}

das hat jetzt funktioniert. Allerdings fehlt bei $_SamaccountName noch ein Punkt, also $_.Samaccountname, damit hat es jetzt geklappt. Ich danke dir vielmals für deine Geduld und deine Hilfe.

Gruß Alex.K
3803037559
3803037559 19.09.2022 um 11:14:53 Uhr
Goto Top
Upps sorry korrigiert.
Alex.K
Alex.K 19.09.2022 um 11:25:06 Uhr
Goto Top
habs ja selber gesehen und korrigiert. ein wenig was habe ich ja beim Schreiben von dem ganzen Code ja auch gelernt face-wink, aber bei dem Fehler habe ich selber einfach keine Lösung gefunden.

Bin dir auf alle Fälle sehr dankbar.

Was ich noch Fragen wollte, was meintest du mit dem Satz?

Zitat von @3803037559:
... vollkommen überflüssig (wie vieles andere im Skript auch)

Bin um Verbesserungsvorschläge sehr dankbar.

Gruß Alex.K