9

Mam kawałek kodu, który wygląda tak:Sprawdzanie istnienia obiektu AD; jak mogę uniknąć brzydkiego komunikatu o błędzie?

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

Niestety, kiedy Get-ADUser DN nie znaleźć użytkownika (co jest w porządku, oznacza to, że nazwa obiektu nie jest brany), rzuca do góry i wypluwa błąd. Wiem, że to się nie uda, to dobrze, dlatego mam -ErrorAction do SilentlyContinue. Niestety wydaje się, że nic nie robi ... Nadal dostaję barfa na wyjściu skryptu. Kod działa, jest po prostu brzydki, ponieważ konsola wypluwa błąd.

  • Czy istnieje lepszy sposób sprawdzenia, czy dany obiekt istnieje?
  • Jeśli nie, czy istnieje sposób, aby funkcja ErrorAction prawidłowo działała?
+1

Uwaga: z rozwiązaniem try ... catch możesz być bardziej konkretny; tj. poprzez wychwycenie określonych wyjątków. 'try {Get-ADUser $ DN -EA Stop} catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException] {" nice try "} catch {" nie spodziewany problem "}' – JohnLBevan

+1

Wygląda na to, że 'get-aduser -erroraction 'silentlycontinue'' działać poprawnie w powershell-v4.0. –

Odpowiedz

1

chcesz złapać wyjątek obiektu nie zostanie znaleziony, ale nadal chcesz zawieść do inne powody, takie jak odmowa dostępu i takie, więc musisz określić dokładny wyjątek do złapania.

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

Aby określić typ wyjątku do połowu w innych przypadków użycia, spowoduje wyjątek, a następnie wykonaj:

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

Wyjście że idzie do: catch [insert wyjątek wpisz tutaj]

2

Wygląda na to, że to polecenie wysyła błąd zakończenia. Użyj operatora try { ... } catch { ... }, aby obsłużyć/zlikwidować błąd.

8

To wyjątek, można po prostu spróbować złapać ją tak:

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

To działa idealnie. – HostBits

0

zrobiłbym to tak:

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

identyfikator lub inny niepowtarzalny identyfikator.

Spowoduje to przywrócenie użytkownika lub wartości NULL i zawinie wyjątek.

+2

To działa, ale jest okropnie powolne, jeśli masz nawet umiarkowaną AD. Pobieranie każdego obiektu, a następnie filtrowanie nie jest praktyczne. –

+0

Tak, dotyczy to mniejszego zestawu elementów iteracyjnych. W rzeczywistości jest to to samo co Shay Levy, ale pojedyncza linia. –

+0

Jesteś tego pewien? Miałem wrażenie, że - Filtr został przekazany bezpośrednio jako zapytanie LDAP, aby zapobiec zwróceniu przez serwer tysięcy wyników. –

16

Jedynym sposobem znalazłem się działać bez plucia błąd jest z parametrem filtr:

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

Jak uzyskać '-Properties *" i nadal pozbyć się tych błędów? –

Powiązane problemy