2012-02-11 1 views
3

Предположим, что я уже настроил IIS, чтобы разрешить удаленную рабочую область «полный», как мне решить исключение, которое я получаю там, где Powershell говорит, что «%» не найден.PowerShell говорит, что '%' и `New-Object` не найдены. Мне не хватает импорта? WinRM или Exchange Role?

Затем, когда я прокомментирую заявление о нарушении for..each, он говорит, что New-Object не найден.

Я пропускаю импорт? Исходя из комментариев, возможно, что мне не хватает какой-либо конфигурации в WinRM или в роли роли Exchange 2010.

public static void testExchangeMBScript() 
{ 
    PSCredential credential = new PSCredential(@"domain\me", createPassword("pw")); 

WSManConnectionInfo connectionInfo = new WSManConnectionInfo(false, "exchangehost.company.com", 80, "/Powershell", "http://schemas.microsoft.com/powershell/Microsoft.Exchange", credential); 

connectionInfo.AuthenticationMechanism = AuthenticationMechanism.Default; 

Runspace runspace = System.Management.Automation.Runspaces.RunspaceFactory.CreateRunspace(connectionInfo); 

try 
{ 
    runspace.Open(); 
    Pipeline pipeline = runspace.CreatePipeline(); 

    string ps1 = "Get-MailboxDatabase -Status"; 
    string PSFull = @" $Databases = Get-MailboxDatabase -Status 
    foreach($Database in $Databases) { 
     $DBSize = $Database.DatabaseSize 
     $MBCount = @(Get-MailboxStatistics -Database $Database.Name).Count 

     $AllMBStats = Get-MailboxStatistics -Database $Database.Name  
    $MBItemAssocCount = $AllMBStats | %{$_.AssociatedItemCount.value} | Measure-Object -Average -Sum 
    $MBDeletedCount = $AllMBStats | %{$_.DeletedItemCount.value} | Measure-Object -Average -Sum 
    $MBItemCount =  $AllMBStats | %{$_.ItemCount.value} | Measure-Object -Average -Sum 
    $MBDeletedItemSize= $AllMBStats | %{$_.TotalDeletedItemSize.value.ToMb() } | Measure-Object -Average -Sum 
    $MBItemSize =  $AllMBStats | %{$_.TotalItemSize.value.ToMb()} | Measure-Object -Average -Sum  

     New-Object PSObject -Property @{ 
Server = $Database.Server.Name 
DatabaseName = $Database.Name 
UserCount = $MBCount 
""DatabaseSize (GB)"" = $DBSize.ToGB() 
""AverageMailboxSize (MB)"" = $MBItemSize.Average 
""WhiteSpace (MB)"" = $Database.AvailableNewMailboxSpace.ToMb() 
ItemCount = $MBItemCount.Sum 
""LogicalSize (MB)"" = $MBItemSize.Sum 
     } 
    } 
"; 
    pipeline.Commands.AddScript(PSFull); 



    // This method cannot be called multiple times on a given pipeline. The state of the 
    // pipeline must be NotStarted when Invoke is called. When this method is called, it 
    // changes the state of the pipeline to Running. 
    // see http://msdn.microsoft.com/en-us/library/windows/desktop/ms569128(v=vs.85).aspx 
    if (pipeline.PipelineStateInfo.State == PipelineState.NotStarted) 
    { 
     Collection<PSObject> results = pipeline.Invoke(); 
    } 
} 
catch (RemoteException re) 
{ 

    // if: Assignment statements are not allowed in restricted language mode or a Data section. 
    // then: configure IIS application settings PSLanguageMode = FullLanguage 
} 
catch (Exception e) 
{ 

} 
     } 
+0

Я бы себе псевдоним поддерживается ... '%' является псевдонимом для 'ForEach-Object 'командлет. Это работает, если вы поместите полное имя командлета? –

+0

Когда я делаю это изменение, я получаю следующее исключение: «Термин« ForEach-Object »не распознается как имя командлета, функции, файла сценария или действующей программы» – LamonteCristo

+0

Эти удаленные сеансы искалечены для использования foreach- объект. Измените их на foreach loop, и я уверен, что это будет работать лучше. – mjolinor

ответ

1

Удаленная сессия - это ограниченное пространство. Это не позволяет использовать командлеты, которые вы хотите для своего скрипта. Я полагаю, что вам нужно будет использовать неограниченное локальное пространство, а затем оттуда будут выполняться командлеты управления Exchange в удаленной рабочей области с помощью invoke-команды:

$ AllMBStats = invoke-command {Get-MailboxStatistics -Database $ databasename} -argumentlist $ database.name -connectionuri "http://exchangehost.company.com/powershell"

Затем работайте с возвратом от этого в локальной рабочей области.

+0

Можете ли вы помочь мне понять разницу в том, как я подключаюсь к ограниченному и неограниченному удаленному рабочему пространству с помощью C#/Powershell? – LamonteCristo

+0

Вы можете подключиться только к удаленному неограниченному пространству, если есть машина, настроенная для предоставления вам одного. Я не использую C#, поэтому я могу рассказать вам, как его создать, но просто используя powershell, я бы открыл сеанс powershell на локальной машине, а затем запустил команду invoke с помощью connecturi, указывающей на сервер Exchange , просто используя удаленный сеанс для выполнения командлетов Exchange и выполнения таких действий, как вычисление средних значений на основе возвращаемых значений, и создание пользовательских объектов в локальном сеансе. – mjolinor

+0

Хм [эта настройка IIS Powershell относится] (http://security.stackexchange.com/q/11601/396) к тому, о чем вы говорите? ... нажмите ссылку IIS для получения дополнительной информации. – LamonteCristo

Смежные вопросы