2017-03-31 2 views
1

Dieser Teil meines Skript ist:Powershell Verzeichnisdienst-Objektfehler nicht catched weder gefangen

Trap {Write-Output 'Authentication Error trapped'} 
Try {New-Object System.DirectoryServices.DirectoryEntry $strDistinguishedName,$strUsername,$strPlainPassword -ErrorAction stop} 
Catch{Write-Output 'Authentication Error catched'} 
Write-Output 'Script has not trapped nor catched the error but continued' 

Der Fehler nur wird das Skript beendet und ich fand keinen Weg, um den Fehler zu fangen oder zu stoppen.

Das Skript schreibt nicht einmal die letzte Zeile, was bedeutet, dass es das Skript vollständig verlassen hat. Hier

ist die gesamte Ausgabe:

PS C:\Temp> & .\test.ps1 
format-default : The following exception occurred while retrieving member "distinguishedName": "Logon failure: unknown user name or bad password. 
"+ CategoryInfo   : NotSpecified: (:) [format-default], ExtendedTypeSystemException 
+ FullyQualifiedErrorId : CatchFromBaseGetMember,Microsoft.PowerShell.Commands.FormatDefaultCommand 
PS C:\Temp> 

Der Fehlertyp ist:

PS C:\Temp> $Error[0].GetType() 
IsPublic IsSerial Name          BaseType                                        
-------- -------- ----          --------                                        
True  True  CmdletInvocationException    System.Management.Automation.RuntimeException                               
PS C:\Temp> 

Ich habe versucht:

  • Fang oder Fallen [System.Exception]
  • Fang oder Trap [System.Management]
  • den -ErrorAction Parameter
  • zu verwenden, um den $ ErrorActionPreference Variable

Weiß jemand, wie zu stoppen, diesen Fehler zu entfernen?

+0

Das seltsame ist, die Ausnahme stammt tatsächlich aus 'format default', die die Ausgabe Formatierer, um Dinge in der Konsole anzuzeigen, wie zum Beispiel "Out-Default". Der 'New-Object'-Aufruf ist nicht fehlgeschlagen, und Sie können dies sehen, indem Sie' $ x = try {new-object ...} catch {} 'schreiben und es gibt keinen Fehler. Aber wenn Sie dann versuchen, $ x zu sehen, was es ist, gibt es einen Fehler. Danach versuchen Sie '" $ x "' und es behauptet, ein 'System.DirectoryServices.DirectoryEntry' zu sein. Aber Sie können nicht '$ x.GetType()' weil es 'ParentContainsErrorRecordException' auslöst. Was ist da los? – TessellatingHeckler

+0

Gleiches hier diskutiert: http://stackoverflow.com/q/26262384/478656 – TessellatingHeckler

+0

Sie sind richtig für den Link. Ich suchte, fand aber kein Thema, das bereits über dieses merkwürdige Verhalten sprach. Ihre Anfrage war effektiver als meine ;-) Sie können Ihren Link als Antwort veröffentlichen. – Luke

Antwort

0

Ich bin kürzlich auf den gleichen Fehler gestoßen und habe versucht, ein DirectoryEntry-Objekt auf RootDSE in einer Domäne zu instanziieren, in der die aktuelle Domäne nicht vertrauenswürdig ist. Was ich gefunden habe, ist, dass das Aufrufen einer Methode für das resultierende Objekt ermöglicht, dass die Ausnahme erfolgreich gefangen/gefangen wird.

So ist dies nicht so funktionieren könnte zu erwarten:

try 
{ 
    $RDSE = [adsi]"LDAP://UntrustedService/RootDSE" 
} 
catch 
{ 
    Write-Warning "Unable to connect to service" 
} 

Aber das tut:

try 
{ 
    $RDSE=[adsi]"LDAP://UntrustedService/RootDSE" 
    [void]$RDSE.ToString() 
} 
catch [System.Management.Automation.RuntimeException] 
{ 
    Write-Warning "Unable to connect to service" 
} 
catch #Default 
{ 
    Write-Warning "Some other error" 
} 
+0

danke für deinen Vorschlag. Allerdings kann ich Ihr Objekt nicht verwenden, da ich in meinem Fall die Methode ** ValidateCredentials ** brauche. Vielleicht kann es jemand anderem helfen, diesen Beitrag zu lesen ... :-) – Luke

Verwandte Themen