9

tengo un poco de código que tiene este aspecto:Comprobación de la existencia de un objeto AD; ¿Cómo evito un mensaje de error feo?

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

Por desgracia, cuando Get-ADUser el DN no puede encontrar un usuario (que está bien, significa que el nombre del objeto no se tiene), que lanza y escupe un error. Sé que fallará, está bien, por eso tengo un -ErrorAction a SilentlyContinue. Lamentablemente, parece que no hace nada ... Todavía me sale barf en la salida del script. El código funciona, es feo debido a que la consola escupe el error.

  • ¿Existe alguna forma mejor para que pruebe si existe un objeto en particular?
  • Si no, ¿hay alguna manera de hacer que ErrorAction guarde silencio correctamente?
+1

NB: con la solución try ... catch puedes ser más específico; es decir, atrapando excepciones nombradas. 'try {Get-ADUser $ DN -EA Stop} catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException] {" nice try "} catch {" not the expected issue "}' – JohnLBevan

+1

'get-aduser -erroraction 'silenntlycontinue'' parece para funcionar correctamente en powershell-v4.0. –

Respuesta

1

que se desea capturar la excepción de que el objeto no ser descubierto, pero todavía quiere fallar por otras razones como acceso denegado y tal, por lo que debe especificar la excepción exacta para capturar.

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

Para determinar el tipo de excepción para atrapar en otros casos de uso, provocar una excepción y luego hacer:

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

La salida que se dedica a: captura [Excepción Tipo de inserción aquí]

2

Parece que este comando está emitiendo un error de terminación. Use un try { ... } catch { ... } para manejar/suprimir el error.

8

Es una excepción, sólo puede tratar de atraparlo así:

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

Esto funciona perfectamente. – HostBits

0

Me gustaría hacer esto de esta manera:

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

Id o algún otro identificador único.

Esto devolverá el usuario o nulo y ajustará la excepción.

+2

Eso funciona, pero es horriblemente lento si tienes incluso un anuncio publicitario de tamaño moderado. Al recoger cada objeto, el filtrado no es práctico. –

+0

Sí, esto es para un conjunto más pequeño de iterables. En realidad, es lo mismo que la línea única de Shay Levy. –

+0

¿Estás seguro de eso? Tenía la impresión de que -Filter se pasó directamente como una consulta LDAP, para evitar que el servidor devuelva miles de resultados. –

16

La única manera que he encontrado para trabajar sin escupir un error es con el parámetro de filtro:

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

¿Cómo obtengo '-Properties *' y aun así me deshago de estos errores? –

Cuestiones relacionadas