2011-04-30 12 views
7

Obecnie buduję aplikację do automatyzacji niektórych operacji Exchange 2010 ze strony internetowej ASP.NET MVC.PowerShell ParameterBindingException

W tej chwili uruchomiłem wyjątek ParameterBindingException, gdy próbuję wywołać polecenie New-AddressList.

Próbuję utworzyć następujące połączenia (które działa):

new-AddressList -Name "7 AL" -RecipientContainer "myDomain.local/Customers/7" -IncludedRecipients 'AllRecipients' -Container '\' -DisplayName "7 AL" 

robie to brzmienie:

var NewAddressList = new Command("New-AddressList"); 
NewAddressList.Parameters.Add("Name", "7 AL"); 
NewAddressList.Parameters.Add("RecipientContainer", "myDomain.local/Customers/7"); 
NewAddressList.Parameters.Add("IncludedRecipients", "AllRecipients"); 
NewAddressList.Parameters.Add("Container", @"\"); 
NewAddressList.Parameters.Add("DisplayName", "7 AL"); 
CommandsList.Add(NewAddressList); 

Ten commandlist jest do rurociągu, który przywołuję, podając następujący błąd:

New-AddressList: Obiekt wejściowy nie może być powiązany z żadnymi parametrami dla polecenia, ponieważ polecenie nie przyjmuje wejścia potoku lub input i jego właściwości nie pasują do żadnego z parametrów, które pobierają potok pipeline.

  • CategoryInfo: InvalidArgument: (7: PSObject) [New-AddressList] ParameterBindingException
  • FullyQualifiedErrorId: InputObjectNotBound, Microsoft.Exchange.Management.SystemConfigurationTasks.NewAddressList

Wszelkie wskazówki, co może powodować to?

Wyjście z Trace-Komendy daje:

PS C:\Users\ext_kefu> Trace-Command -Name parameterbinding -Expression {New-AddressList -Name "7 AL" -RecipientContainer "myDomain.local/Customers/7" -IncludedRecipients 'AllRecipients' -Container '\' -DisplayName "7 AL"} -PSHost 
DEBUG: ParameterBinding Information: 0 : BIND NAMED cmd line args [New-AddressList] 
DEBUG: ParameterBinding Information: 0 :  BIND arg [7 AL] to parameter [Name] 
DEBUG: ParameterBinding Information: 0 :   COERCE arg to [System.String] 
DEBUG: ParameterBinding Information: 0 :    Parameter and arg types the same, no coercion is needed. 
DEBUG: ParameterBinding Information: 0 :   BIND arg [7 AL] to param [Name] SUCCESSFUL 
DEBUG: ParameterBinding Information: 0 :  BIND arg [myDomain.local/Customers/7] to parameter [RecipientContainer] 
DEBUG: ParameterBinding Information: 0 :   COERCE arg to [Microsoft.Exchange.Configuration.Tasks.OrganizationalUnitIdParameter] 
DEBUG: ParameterBinding Information: 0 :    Trying to convert argument value from System.String to Microsoft.Exchange.Configuration.Tasks.OrganizationalUnitIdParameter 
DEBUG: ParameterBinding Information: 0 :    CONVERT arg type to param type using LanguagePrimitives.ConvertTo 
DEBUG: ParameterBinding Information: 0 :    CONVERT SUCCESSFUL using LanguagePrimitives.ConvertTo: [myDomain.local/Customers/7] 
DEBUG: ParameterBinding Information: 0 :   BIND arg [myDomain.local/Customers/7] to param [RecipientContainer] SUCCESSFUL 
DEBUG: ParameterBinding Information: 0 :  BIND arg [AllRecipients] to parameter [IncludedRecipients] 
DEBUG: ParameterBinding Information: 0 :   COERCE arg to [System.Nullable[Microsoft.Exchange.Data.Directory.Recipient.WellKnownRecipientType]] 
DEBUG: ParameterBinding Information: 0 :    Trying to convert argument value from System.String to System.Nullable[Microsoft.Exchange.Data.Directory.Recipient.WellKnownRecipientType] 
DEBUG: ParameterBinding Information: 0 :    CONVERT arg type to param type using LanguagePrimitives.ConvertTo 
DEBUG: ParameterBinding Information: 0 :    CONVERT SUCCESSFUL using LanguagePrimitives.ConvertTo: [AllRecipients] 
DEBUG: ParameterBinding Information: 0 :   BIND arg [AllRecipients] to param [IncludedRecipients] SUCCESSFUL 
DEBUG: ParameterBinding Information: 0 :  BIND arg [\] to parameter [Container] 
DEBUG: ParameterBinding Information: 0 :   COERCE arg to [Microsoft.Exchange.Configuration.Tasks.AddressListIdParameter] 
DEBUG: ParameterBinding Information: 0 :    Trying to convert argument value from System.String to Microsoft.Exchange.Configuration.Tasks.AddressListIdParameter 
DEBUG: ParameterBinding Information: 0 :    CONVERT arg type to param type using LanguagePrimitives.ConvertTo 
DEBUG: ParameterBinding Information: 0 :    CONVERT SUCCESSFUL using LanguagePrimitives.ConvertTo: [\] 
DEBUG: ParameterBinding Information: 0 :   BIND arg [\] to param [Container] SUCCESSFUL 
DEBUG: ParameterBinding Information: 0 :  BIND arg [7 AL] to parameter [DisplayName] 
DEBUG: ParameterBinding Information: 0 :   COERCE arg to [System.String] 
DEBUG: ParameterBinding Information: 0 :    Parameter and arg types the same, no coercion is needed. 
DEBUG: ParameterBinding Information: 0 :   BIND arg [7 AL] to param [DisplayName] SUCCESSFUL 
DEBUG: ParameterBinding Information: 0 : BIND POSITIONAL cmd line args [New-AddressList] 
DEBUG: ParameterBinding Information: 0 : MANDATORY PARAMETER CHECK on cmdlet [New-AddressList] 
DEBUG: ParameterBinding Information: 0 : CALLING BeginProcessing 
DEBUG: ParameterBinding Information: 0 : CALLING EndProcessing 

Name      DisplayName    RecipientFilter 
----      -----------    --------------- 
7 AL      7 AL      Alias -ne $null 

Odpowiedz

2

Uważam, że każda komenda musi zostać wywołana oddzielnie, ponieważ nie są one związane. Pytanie wynikło z mojego niezrozumienia koncepcji rurociągów Powershell.

1

Czemu deklarując polecenia jako var? To znaczy:

 
Command NewAddressList = new Command("New-AddressList"); 

Następnie spróbuj dodać polecenia jako CommandParameter obiektów (jako sugerowane here):

 
CommandParameter NameParam = new CommandParameter("Name","7 AL"); 
NewAddressList.Parameters.Add(NameParam); 

Wreszcie, dlaczego nie bezpośrednio przy użyciu klasy Powershell?


EDIT: Dalsze przypuszczenie po śledzenie

przeciążonej wersja Parameters.Add używasz bierze jako argumenty klucz (String) i wartość (Object). Prawdopodobnie C# nie robi tego samego dobrego zadania powershell robi: /. Spróbuj przekazać wartości jako obiekty wymaganego typu. Na przykład parametr included-recipient wymaga Microsoft.Exchange.Data.Directory.Recipient.WellKnownRecipientType.

Spróbuj rzucić.

Przykład:

 
Microsoft.Exchange.Data.Directory.Recipient.WellKnownRecipientType allrecips = (Microsoft.Exchange.Data.Directory.Recipient.WellKnownRecipientType) "AllRecipients"; 
NewAddressList.Parameters.Add("IncludedRecipients", allrecips); 

lub (wiem, może to być głupie):

 
NewAddressList.Parameters.Add("IncludedRecipients", "[Microsoft.Exchange.Data.Directory.Recipient.WellKnownRecipientType] AllRecipients"); 
+0

Dziękuję za odpowiedź.Niestety nic nie zmieniło. Ta odmiana to tylko nawyk. Mam opakowanie dla klasy Powershell i dlatego tworzę kolekcję , którą przekazuję do mojego opakowania. – kfuglsang

+0

Czy jesteś pewien, że polecenie działa z powłoki powershell? Czy jesteś w stanie uzyskać ślad za pomocą 'Trace-Command'? –

+0

Mam zaktualizowane oryginalne pytanie z danymi wyjściowymi śledzenia. Polecenie działa poprawnie. – kfuglsang