2017-11-19 5 views
1

Ich versuche, um die Warnung zu erfassen, die ausgelöst werden, wenn ich versuche, Postfachberechtigungen für jemanden aus einem Postfach zu entfernen, die Berechtigungen nicht an erster Stelle.Capturing Power Warnung

#$WarningPreference = "continue" 
try 
{ 
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010 
Remove-MailboxPermission -Identity "test2" -User "test1" -AccessRights FullAccess -InheritanceType All -confirm:$False | Out-File c:\temp\output2.txt -Encoding ASCII 
} 
catch 
{ 
#Write-Warning -Message $($_.Exception.Message) 3 > c:\temp\warning.txt 
} 

Es erfolgt keine Ausgabe entweder in output2.txt oder warning.txt ist - was mache ich falsch?

Die Warnungen Ich versuche, in gelb zu erfassen erscheinen und sagen:

WARNING: The cmdlet extension agent with the index 0 has thrown an exception in OnComplete(). The exception is: 
System.InvalidOperationException: Operation is not valid due to the current state of the object. 
    at Microsoft.Exchange.Data.Storage.ExchangePrincipal.get_ServerFullyQualifiedDomainName() 
    at Microsoft.Exchange.Data.Storage.MailboxSession.Initialize(MapiStore linkedStore, LogonType logonType, 
ExchangePrincipal owner, DelegateLogonUser delegateUser, Object identity, OpenMailboxSessionFlags flags, 
GenericIdentity auxiliaryIdentity) 
    at Microsoft.Exchange.Data.Storage.MailboxSession.<>c__DisplayClass12.<CreateMailboxSession>b__10(MailboxSession 
mailboxSession) 
    at Microsoft.Exchange.Data.Storage.MailboxSession.InternalCreateMailboxSession(LogonType logonType, 
ExchangePrincipal owner, CultureInfo cultureInfo, String clientInfoString, IAccountingObject budget, Action`1 
initializeMailboxSession, InitializeMailboxSessionFailure initializeMailboxSessionFailure) 
    at Microsoft.Exchange.Data.Storage.MailboxSession.ConfigurableOpen(ExchangePrincipal mailbox, MailboxAccessInfo 
accessInfo, CultureInfo cultureInfo, String clientInfoString, LogonType logonType, PropertyDefinition[] 
mailboxProperties, InitializationFlags initFlags, IList`1 foldersToInit, IAccountingObject budget) 
    at Microsoft.Exchange.Data.Storage.MailboxSession.OpenAsSystemService(ExchangePrincipal mailboxOwner, CultureInfo 
cultureInfo, String clientInfoString) 
    at Microsoft.Exchange.ProvisioningAgent.MailboxLoggerFactory.XsoMailer.Log(AdminLogMessageData data, 
LogMessageDelegate logMessage) 
    at Microsoft.Exchange.ProvisioningAgent.AdminLogProvisioningHandler.OnComplete(Boolean succeeded, Exception e) 
    at Microsoft.Exchange.Provisioning.ProvisioningLayer.OnComplete(Task task, Boolean succeeded, Exception exception) 
WARNING: Can't remove the access control entry on the object "CN=xxxxx" for account "xxxxx" because the ACE doesn't exist on the 
object. 

Vielen Dank für all die Hilfe so weit! Mein Code sieht nun wie folgt aus:

$WarningPreference = "continue" 
try 
{ 
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010 
Remove-MailboxPermission -Identity "test1" -User "test2" -AccessRights FullAccess -InheritanceType All -confirm:$False 2> c:\temp\errors.txt 3> c:\temp\warnings.txt -ErrorAction Stop 
} 
catch 
{ 
2> c:\temp\errors.txt 
} 

* ENDLÖSUNG - DANKE ALL *

$WarningPreference = "continue" 
try 
{ 
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010 
Remove-MailboxPermission -Identity "test1" -User test2" -AccessRights FullAccess -InheritanceType All -confirm:$False 2> c:\temp\errors.txt 3> c:\temp\warnings.txt -ErrorAction Stop 
} 
catch 
{ 
$_ > c:\temp\errors.txt 
} 
+0

'2> c: \ temp \ fehler.txt' ->' $ _> c: \ temp \ fehler.txt' - '$ _' steht für die Ausnahme. (Was '2> c: \ temp \ errors.txt' tut, ist das Senden einer Ganzzahl' 2' (stringifiziert) über den erfolgreichen Ausgabestrom an die Datei). – mklement0

Antwort

1

In Anbetracht der allgemeinen Titel Frage, lassen Sie mich zunächst rekapitulieren wie Warnungen Erfassung arbeitet im Allgemeinen:

  • Um ein Datei wie warnings.txt: mit 3> warnings.txt

    • Um suppress Warnungen ad hoc: 3> $null
  • In einer variable wie $warnings: mit -WarningVariable warnings (-wv warnings)

    • jedoch, dass noch die Pässe Warnungen durch und daher druckt sie, so dass Sie auch verwenden müssen 3> $null.

anzumerken, dass diese Konstrukte auf die sehr Befehl Erzeugung der Warnungen angewendet werden müssen, wie (Standard) nur der Erfolg Ausgangsstrom (der Strom mit dem Index 1) wird durch die Pipeline geschickt:

# OK - saves warnings to file 'warnings.txt' without printing them. 
Do-Stuff 3> warnings.txt | Out-File out.txt 

# INCORRECT - still prints warnings, because they are NOT sent through the 
#    pipeline, and then creates empty file 'warnings.txt', because 
#    Out-File itself produces no warnings. 
Do-Stuff | Out-File out.txt 3> warnings.txt 

was was Sie versucht:

Es gibt keinen Ausgang entweder output2.txt oder warning.txt

  • Vermutlich gibt es keinen Ausgang in output2.txt, weil die Remove-MailboxPermission nicht produziert hat jeden Erfolg Ausgang noch zu der Zeit Es löst eine Ausnahme aus. Wenn die Ausnahme auftritt, wird die Kontrolle sofort an den Handler catch übergeben, so dass die Pipeline genau dort angehalten wird und Out-File niemals eine Eingabe von Remove-MailboxPermissions Erfolgsstrom erhält.

    • Beachten Sie, dass try/catch ist nur dann wirksam, wenn Remove-MailboxPermission standardmäßig eine Anweisung- beendet Fehler erzeugt; um es auch für nicht terminierende Fehler wirksam werden, fügen -ErrorAction Stop hinzu.
      Wenn die Remove-MailboxPermission produziert nur Warnungen - und keinen Fehler überhaupt - dann try/catch wird keine Wirkung haben.
  • Es gibt keine Ausgabe (reaktivierten auch mit der Linie, die die anfänglichen # durch Entfernen) in warning.txt, weil try/catch nur fängt Fehler Ausgang, nicht Warnungen; Das heißt, die Warnungen haben bereits ausgedruckt, wenn der Handler catch verarbeitet wird.

0

Verwenden Sie die -warningaction und -WarningVariable gemeinsame Parameter, die die Warnung auf eine Variable zu erfassen und dazu führen, dass nicht zur Konsole zeigen.

Remove-MailboxPermission -Identity "test2" -User "test1" -AccessRights FullAccess -InheritanceType All -confirm:$False | Out-File c:\temp\output2.txt -Encoding ASCII -WarningAction SilentlyContinue -WarningVariable CapturedWarning 

Dann sollte $CapturedWarning die Warnung darin haben.

+0

Ich bekomme immer noch die gelbe Warnung, aber wenn ich versuche, den Inhalt der CapturedWarning-Variable anzuzeigen, ist sie leer. –

+0

Echo "Warnung: $ CapturedWarning" –

+0

Seltsam. Ich kann Ihr spezifisches Cmdlet nicht testen, aber das Erstellen einer "Test" -Funktion, die nur eine Warnung schreibt, zeigt, dass diese Technik gut funktioniert, da sie die Warnung in einer Variablen erfasst und nicht in die Konsole geschrieben wird. –

1

hinzufügen -WarningAction Stop oder -ErrorAction Stop zu Ihrem Remove-MailboxPermission Befehl:

try 
{ 
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010 
Remove-MailboxPermission -Identity "test2" -User "test1" -AccessRights FullAccess -InheritanceType All -confirm:$False -WarningAction Stop -ErrorAction Stop | Out-File c:\temp\output2.txt -Encoding ASCII 
} 
catch 
{ 
#Write-Warning -Message $($_.Exception.Message) 3 > c:\temp\warning.txt 
} 
+0

-ErrorAction Stop war in diesem Fall ein wichtiges Puzzleteil. Ich bin in diesem Fall OK, um weiterzumachen, wenn es eine Warnung gibt, da die Warnung nicht ernst ist :) Danke! –