Что такое команда для доступа к средствам управления Exchange из кода C # в Exchange 2010 - PullRequest
1 голос
/ 27 августа 2010

В Exchange 2007 эта строка кода используется для загрузки оснастки команд Exchange Poweshell:

PSSnapInInfo info = rsConfig.AddPSSnapIn(
  "Microsoft.Exchange.Management.PowerShell.Admin",
  out snapInException);

Однако этого не существует в Exchange 2010, и я пытаюсь выяснить, как получить доступ к командам Exchange Powershell из кода C #. Microsoft.Exchange.Management.PowerShell.Admin не существует нигде на сервере Exchange, и я не могу найти в Google ничего, что говорило бы об эквивалентной строке кода.

Как получить доступ к средствам управления Exchange из кода C # в Exchange 2010?

Ниже приведен мой полный код для справки, все работает, пока я не добавлю строку кода:

                //Creating and Opening a Runspace
            RunspaceConfiguration rsConfig = RunspaceConfiguration.Create();
            PSSnapInException snapInException = null;
            PSSnapInInfo info = rsConfig.AddPSSnapIn(
               "Microsoft.Exchange.Management.PowerShell.Admin",
               out snapInException);
            Runspace myRunSpace = RunspaceFactory.CreateRunspace(rsConfig);
            myRunSpace.Open();

            //How Do I Run a Cmdlet?
            //create a new instance of the Pipeline class 
            Pipeline pipeLine = myRunSpace.CreatePipeline();

            //create an instance of the Command class
            // by using the name of the cmdlet that you want to run
            Command myCommand = new Command(txtCommand.Text);

            //add the command to the Commands collection of the pipeline
            pipeLine.Commands.Add(myCommand);

            Collection<PSObject> commandResults = pipeLine.Invoke();

            // iterate through the commandResults collection
            // and get the name of each cmdlet
            txtResult.Text = "start ....";
            foreach (PSObject cmdlet in commandResults)
            {
                string cmdletName = cmdlet.Properties["Name"].Value.ToString();
                System.Diagnostics.Debug.Print(cmdletName);
                txtResult.Text += "cmdletName: " + cmdletName;
            }
            txtResult.Text += ".... end";

Ответы [ 3 ]

1 голос
/ 04 сентября 2010

После долгих проб и ошибок я наконец понял это. Проблема с приведенным выше кодом заключается в том, что он отлично работает при работе с Exchange 2007, но в Exchange 2010 все изменилось. Вместо оснастки «Microsoft.Exchange.Management.PowerShell.Admin» используйте эту оснастку «Microsoft.Exchange.Management». .PowerShell.E2010" .

Полный код для запуска команды Powershell из C # выглядит следующим образом. Надеюсь, это поможет кому-то другому, пытающемуся сделать это.

Вам также понадобятся ссылки на System.Management.Automation.Runspaces, System.Collections.ObjectModel и System.Management.Automation.

Я обнаружил, что ссылку на System.Management.Automation необходимо было вручную добавить в сам файл csproj в разделе ItemGroup с помощью блокнота, например:

  <Reference Include="System.Management.Automation" />

код ниже:

private class z_test
{
    //set up
    private RunspaceConfiguration rsConfig = RunspaceConfiguration.Create();
    private PSSnapInException snapInException = null;
    private Runspace runSpace;

    private void RunPowerShell()
    {
        //create the runspace
        runSpace = RunspaceFactory.CreateRunspace(rsConfig);
        runSpace.Open();
        rsConfig.AddPSSnapIn("Microsoft.Exchange.Management.PowerShell.E2010", out snapInException);

        //set up the pipeline to run the powershell command 
        Pipeline pipeLine = runSpace.CreatePipeline();

        //create the script to run
        String sScript = "get-mailbox -identity 'rj'";

        //invoke the command
        pipeLine.Commands.AddScript(sScript);

        Collection<PSObject> commandResults = pipeLine.Invoke();

        //loop through the results of the command and load the SamAccountName into the list
        foreach (PSObject results in commandResults)
        {
            Console.WriteLine(results.Properties["SamAccountName"].Value.ToString());
        }

        pipeLine.Dispose();

        runSpace.Close();
    }
}
1 голос
/ 27 августа 2010

Не знаю точно, но Exchange 2010 powershell мог бы быть реализован как модуль powershell 2.0, который загружается другим способом. Чтобы выяснить это, перейдите в систему с оболочкой управления обменом и запустите ее. Далее выполните:

ps> get-module

Будет выведен список загруженных модулей v2. Я ожидаю, что обменный пункт появится, если вы запустили специальную оболочку управления обменом. Если вы загрузили обычную консоль PowerShell, попробуйте:

ps> get-module -list

В этом списке перечислены все модули, доступные для загрузки. Если вы выберете правильный вариант, то вам нужно будет построить свой код с помощью dll system.management.automation v2. По причинам, выходящим за рамки этого ответа, сборка powershell v2 имеет то же строгое имя, что и v1, поэтому вы не можете легко иметь обе версии powershell на одном компьютере. Создайте это на компьютере с установленной PowerShell v2:

InitialSessionState initial = InitialSessionState.CreateDefault();
initialSession.ImportPSModule(new[] { *modulePathOrModuleName* });
Runspace runspace = RunspaceFactory.CreateRunspace(initial);
runspace.Open();
RunspaceInvoke invoker = new RunspaceInvoke(runspace);
Collection<PSObject> results = invoker.Invoke(*myScript*);

Надеюсь, это поможет,

-Oisin

0 голосов
/ 16 января 2013

Вот что я делаю:

$sessionOptionsTimeout=180000

$sessionOptionsTimeout=180000

$so = New-PSSessionOption -OperationTimeout $sessionOptionsTimeout -IdleTimeout $sessionOptionsTimeout -OpenTimeout $sessionOptionsTimeout

$connectionUri="http://$fqdn/powershell?serializationLevel=Full;ExchClientVer=14.3.91.1"


$s = New-PSSession -ConnectionURI "$connectionUri" -ConfigurationName Microsoft.Exchange -SessionOption $so

$s | Enter-PSSession

PS> get-mailboxserver

EncryptionRequired        AutoDatabaseMountDial        DatabaseCopyAutoActivationPo
                                                       licy
------------------        ---------------------        ----------------------------
e                         GoodAvailability             Unrestricted
e                         GoodAvailability             Unrestricted

Теперь преобразование выше в .net (c #) должно быть легким ...

По существу, выдержка из: "C: \ Program Files \ Microsoft \ Exchange Server \ V14 \ Bin \ ConnectFunctions.ps1"

Пожалуйста, обратитесь к следующей функции:

function _NewExchangeRunspace([String]$fqdn, 
                [System.Management.Automation.PSCredential] 
$credential=$null, 

                [bool]$UseWIA=$true, 

                [bool]$SuppressError=$false,

                $ClientApplication=$null,

                $AllowRedirection=$false)

{
    $hostFQDN = _GetHostFqdn

    if (($fqdn -ne $null) -and ($hostFQDN -ne $null) -and ($hostFQDN.ToLower() -eq $fqdn.ToLower()))

    {
        $ServicesRunning = _CheckServicesStarted

        if ($ServicesRunning -eq $false)
        {
            return
        }
    }

    Write-Verbose ($ConnectFunctions_LocalizedStrings.res_0005 -f $fqdn)

    $so = New-PSSessionOption -OperationTimeout $sessionOptionsTimeout -IdleTimeout $sessionOptionsTimeout -OpenTimeout $sessionOptionsTimeout;
    $setupRegistryEntry = get-itemproperty HKLM:\SOFTWARE\Microsoft\ExchangeServer\v14\Setup -erroraction:silentlycontinue
    if ( $setupRegistryEntry -ne $null)
    {
        $clientVersion = "{0}.{1}.{2}.{3}" -f $setupRegistryEntry.MsiProductMajor, $setupRegistryEntry.MsiProductMinor, $setupRegistryEntry.MsiBuildMajor, $setupRegistryEntry.MsiBuildMinor
        $connectionUri = "http://$fqdn/powershell?serializationLevel=Full;ExchClientVer=$clientVersion"
    }
    else
    {
        $connectionUri = "http://$fqdn/powershell?serializationLevel=Full"
    }

    if ($ClientApplication -ne $null)
    {
        $connectionUri = $connectionUri + ";clientApplication=$ClientApplication"
    }

    write-host -fore Yellow ("connectionUri: " + $connectionUri)

    $contents = 'New-PSSession -ConnectionURI "$connectionUri" -ConfigurationName Microsoft.Exchange -SessionOption $so'

    if (-not $UseWIA)
    {
        $contents = $contents + ' -Authentication Kerberos -Credential $credential'
    }
    if ($SuppressError)
    {
        $contents = $contents + ' -erroraction silentlycontinue'
    }
    if ($AllowRedirection)
    {
        $contents = $contents + ' -AllowRedirection'
    }

    write-host -fore Yellow ("contents: " + $contents)
    write-host -fore Yellow ("join n contents: " + [string]::join("`n", $contents))


    [ScriptBlock] $command = $executioncontext.InvokeCommand.NewScriptBlock([string]::join("`n", $contents))
    $session=invoke-command -Scriptblock $command

  if (!$?)
    {
      # ERROR_ACCESS_DENIED = 5
      # ERROR_LOGON_FAILURE = 1326
      if (!(5 -eq $error[0].exception.errorcode) -and
          !(1326 -eq $error[0].exception.errorcode))
      {
            #Write-Verbose ($ConnectFunctions_LocalizedStrings.res_0006 -f $fqdn)
            return
      }
      else
      {
        # no retries if we get 5 (access denied) or 1326 (logon failure)
        #$REVIEW$ connectedFqdn is not set. Is it okay?
        break connectScope
      }
    }
  $session
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...