9

ich ein Stück Code haben, der wie folgt aussieht:Überprüfung auf die Existenz eines AD-Objekts; Wie vermeide ich eine hässliche Fehlermeldung?

if (Get-ADUser $DN -EA SilentlyContinue) { 
    # Exists 
} else { 
    # Doesn't Exist 
} 

Leider, als Get-ADUser die DN eines Benutzers zu finden, fehlschlägt (was in Ordnung ist, es bedeutet, dass der Objektnamen nicht genommen wird), es wirft und spuckt einen Fehler aus. Ich weiß, es wird scheitern, das ist in Ordnung, weshalb ich eine -ErrorAction zu SilentlyContinue habe. Leider scheint es nichts zu tun ... Ich bekomme immer noch Probleme mit der Skriptausgabe. Der Code funktioniert, es ist nur hässlich, weil die Konsole den Fehler ausspuckt.

  • Gibt es einen besseren Weg für mich zu testen, ob ein bestimmtes Objekt existiert?
  • Wenn nicht, gibt es eine Möglichkeit, die ErrorAction ordnungsgemäß zu deaktivieren?
+1

:

$Error[0].Exception.GetType().FullName 

Der Ausgang davon geht in NB: Mit der Try ... Catch Lösung können Sie spezifischer sein; d.h. durch Erfassen von benannten Ausnahmen. 'try {Get-ADUser $ DN -EA Stop} catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException] {" nice try "} catch {" nicht das erwartete Problem "}' – JohnLBevan

+1

'get-aduser -erroaction 'silentlycontinue'' scheint um in powershell-v4.0 richtig zu funktionieren. –

Antwort

1

Sie möchten die Ausnahme des Objekts fangen nicht gefunden wird, aber Sie wollen immer noch scheitern andere Gründe wie Zugriff verweigert und so, so müssen Sie die genaue Ausnahme angeben, um zu fangen.

try { 
    Get-ADUser $DN -ErrorAction Stop 
    # Do stuff if found 
} catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundExce‌​ption] { 
    # Do stuff if not found 
} 

den Ausnahmetyp zu bestimmen, in anderen Anwendungsfällen, verursacht eine Ausnahme und führen Sie dann zu fangen: [Typ hier einfügen Ausnahme] Fang

2

Es scheint, dass dieser Befehl einen Abbruchfehler ausgibt. Verwenden Sie eine try { ... } catch { ... }, um den Fehler zu behandeln/zu unterdrücken.

8

Es ist eine Ausnahme, können Sie nur versuchen, es so zu fangen:

$user = $(try {Get-ADUser $DN} catch {$null}) 
if ($user -ne $null) { 
    # Exists 
} else { 
    # Doesn't Exist 
} 
+1

Das funktioniert perfekt. – HostBits

0

ich dies wie folgt tun würde:

Get-ADUser | ?{$_.id -eq $DN.id} 

Id oder eine andere eindeutige Kennung.

Dies wird den Benutzer oder Null zurückgeben und die Ausnahme umbrechen.

+2

Das funktioniert, aber es ist schrecklich langsam, wenn Sie sogar eine mittelgroße AD haben. Wenn Sie jedes Objekt abrufen, ist das Filtern nicht praktikabel. –

+0

Ja, dies ist für kleinere Iterables. Eigentlich ist es das gleiche wie Shay Levy, aber nur eine Zeile. –

+0

Sind Sie sicher? Ich hatte den Eindruck, dass -Filter direkt als LDAP-Abfrage übergeben wurde, um zu verhindern, dass Tausende von Ergebnissen vom Server zurückgegeben werden mussten. –

16

Der einzige Weg, die ich gefunden habe, ohne zu spucken, einen Fehler zu arbeiten, ist mit dem Filterparameter:

if (Get-ADUser -Filter {distinguishedName -eq $DN}) { 
    # Exists 
} else { 
    # Doesn't Exist 
} 
+0

Wie bekomme ich '-Eigenschaften *' und werde trotzdem diese Fehler los? –

Verwandte Themen