9

Ho un po 'di codice che assomiglia a questo:Controllo dell'esistenza di un oggetto AD; come posso evitare un brutto messaggio di errore?

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

Purtroppo, quando Get-ADUser il DN non riesce a trovare un utente (che va bene, significa che il nome dell'oggetto non è preso), si getta su e sputa un errore. So che fallirà, va bene, ed è per questo che ho un -ErrorAction a SilentlyContinue. Sfortunatamente sembra non fare nulla ... Ricevo ancora un colpo sull'output dello script. Il codice funziona, è solo brutto a causa della console che sputa l'errore.

  • C'è un modo migliore per verificare se esiste un particolare oggetto?
  • In caso contrario, c'è un modo per fare in modo che ErrorAction sia correttamente silenzioso?
+1

NB: con la soluzione try ... catch si può essere più specifici; Ad esempio, rilevando eccezioni denominate. 'prova {Get-ADUser $ DN -EA Stop} cattura [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException] {" nice try "} catch {" non il problema atteso "}' – JohnLBevan

+1

'get-aduser -erroraction 'silentlycontinue'' sembra funzionare correttamente in powershell-v4.0. –

risposta

1

Si vuole intercettare l'eccezione del l'oggetto non viene trovato, ma si vuole ancora fallire per altri motivi come l'accesso negato e così via, quindi è necessario specificare l'esattezza esatta da prendere.

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

Per determinare il tipo di eccezione per la cattura in altri casi d'uso, causare un'eccezione e poi fare:

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

L'uscita che va in: cattura [un'eccezione di tipo inserire qui]

2

Sembra che questo comando stia emettendo un errore di terminazione. Utilizzare un try { ... } catch { ... } per gestire/sopprimere l'errore.

8

Si tratta di un'eccezione, si può solo cercare di catturare in questo modo:

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

Funziona perfettamente. – HostBits

0

farei questo in questo modo:

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

Id o qualche altro identificatore univoco.

Ciò restituirà l'utente o null e avvolgerà l'eccezione.

+2

Funziona, ma è terribilmente lento se si dispone anche di un AD di dimensioni medie. Recuperare ogni oggetto, quindi il filtraggio non è pratico. –

+0

Sì, questo è per un insieme più piccolo di iterabili. In realtà è lo stesso di Shay Levy, ma una sola riga. –

+0

Ne sei sicuro? Ho avuto l'impressione che -Filter fosse passato direttamente come una query LDAP, per evitare che migliaia di risultati dovessero essere restituiti dal server. –

16

L'unico modo che ho trovato per lavorare senza sputare un errore è con il parametro di filtro:

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

Come ottengo '-Properties *' e continuo a eliminare questi errori? –