Удаленное подключение к powershell из С#

Я хочу удаленно подключить powershell из Windows 7 к Windows Server 2008 R2 (установленному в VMware) с помощью ASP.NET.

Это мой код:

    string shell = "http://schemas.microsoft.com/powershell/Microsoft.PowerShell";
    var target = new Uri("http://win-qkheb9s51i8/wsman");

    Pipeline p = runSpace.CreatePipeline();
    SecureString passing = new SecureString();
    string password = "A123456a";

    foreach (char c in password)
    {
        passing.AppendChar(c);
    }
    passing.MakeReadOnly();

    var cred = new PSCredential(@"win-qkheb9s51i8\Administrator", passing);

    var connectionInfo = new WSManConnectionInfo(target, shell, cred);
    connectionInfo.OperationTimeout = 4 * 60 * 1000; // 4 minutes.
    connectionInfo.OpenTimeout = 1 * 60 * 1000;
   runSpace = RunspaceFactory.CreateRunspace(connectionInfo);
   runSpace.Open();

но в runSpace.open() иногда выдает эту ошибку

Не удалось подключиться к удаленному серверу со следующим сообщением об ошибке: Отказано в доступе. Дополнительные сведения см. в разделе справки about_Remote_Troubleshooting.

и иногда эта ошибка:

ОШИБКА: Клиент не может подключиться к месту назначения, указанному в запросе. Убедитесь, что служба в месте назначения работает и принимает запросы.

Я прочитал about_Remote_Troubleshooting, но не понимаю, почему возникают эти ошибки. Может кто-нибудь мне помочь?


person mary    schedule 15.08.2012    source источник
comment
для устранения неполадок ... можете ли вы даже получить соединение с помощью Enter-PSession непосредственно из оболочки PS?   -  person Juan Ayala    schedule 15.08.2012
comment
привет Хуан, да, я могу. после этого я вызываю модуль DHCP, и модуль возвращает результат с удаленного компьютера (сервер Windows).   -  person mary    schedule 16.08.2012
comment
редактировать: теперь код выдает эту ошибку: Не удалось подключиться к удаленному серверу со следующим сообщением об ошибке: Клиент не может подключиться к месту назначения, указанному в запросе. Убедитесь, что служба в месте назначения работает и принимает запросы. Обратитесь к журналам и документации для службы WS-Management, работающей в месте назначения, чаще всего это IIS или WinRM. Если назначением является служба WinRM, выполните следующую команду в месте назначения, чтобы проанализировать и настроить службу WinRM: winrm quickconfig. Дополнительные сведения см. в разделе справки about_Remote_Troubleshooting.   -  person mary    schedule 16.08.2012
comment
вы используете клиент и цель в одном домене, рабочей группе или только один в домене?   -  person Juan Ayala    schedule 16.08.2012
comment
да. Я переустановил IIS сервера Widows. Я получил эту ошибку после запуска кода: клиент WinRM отправил запрос на HTTP-сервер и получил ответ о том, что запрошенный URL-адрес HTTP недоступен. Это обычно возвращается HTTP-сервером HTTP-сервером, который не поддерживает протокол WS_management. Я искал об этом, и их решение было: Запустите WinRM quickconfig на сервере и в диспетчере IIS на веб-сайте по умолчанию / Изменить привязку: удалите имя хоста порта 80. Я сделал это, но не изменил.   -  person mary    schedule 17.08.2012


Ответы (1)


Итак, вы сказали, что обе машины находятся в ОДНОМ домене, но я вижу, что вы пытаетесь использовать учетную запись локального администратора. Это может быть проблемой, но не обязательно. Чтобы воспроизвести это, я установил Win2k8R2 на виртуальную машину и выполнил следующие шаги:

Шаги 1 и 2 относятся к базовой установке Server 2008 R2. Если у вас есть полная установка, просто перейдите к пункту 3.

  1. Run following commands to Install .NET2 & PowerShell (within cmd.exe)
    • DISM /Online /Enable-Feature /Featurename:NetFx2-ServerCore
    • DISM/Online/Enable-Feature/FeatureName:MicrosoftWindowsPowerShell
  2. Install some useful PS CmdLets (within cmd.exe)
    • DISM /online /enable-feature /featurename=ServerManager-PSH-Cmdlets
    • DISM/online/enable-feature/featurename=BestPractices-PSH-командлеты
  3. Enable Remote Shell (within powershell.exe)
    • Set-Excutionpolicy RemoteSigend
    • Configure-SMRemoting.ps1 -force -enable

И затем я взял ваш образец кода, я не внес в него существенных изменений.

        Console.Write("Target: ");
        var target = Console.ReadLine();
        Console.Write("User: ");
        var user = Console.ReadLine();
        user = string.Format("{0}\\{1}", target, user);
        string shell = "http://schemas.microsoft.com/powershell/Microsoft.PowerShell";
        var targetWsMan = new Uri(string.Format("http://{0}:5985/wsman", target));

        using (var passing = new SecureString())
        {
            Console.Write("Password: ");
            var cki = default(ConsoleKeyInfo);
            do
            {
                cki = Console.ReadKey(true);
                if (cki.Key == ConsoleKey.Enter)
                    Console.Write(cki.KeyChar);
                else
                    passing.AppendChar(cki.KeyChar);
            }
            while (cki.Key != ConsoleKey.Enter);
            passing.MakeReadOnly();

            var cred = new PSCredential(user, passing);

            var connectionInfo = new WSManConnectionInfo(targetWsMan, shell, cred);
            connectionInfo.OperationTimeout = 4 * 60 * 1000; // 4 minutes.
            connectionInfo.OpenTimeout = 1 * 60 * 1000;
            using (var runSpace = RunspaceFactory.CreateRunspace(connectionInfo))
            {
                var p = runSpace.CreatePipeline();
                runSpace.Open();
                Console.WriteLine("Connected to {0}", targetWsMan);
                Console.WriteLine("As {0}", user);
                Console.Write("Command to run: ");
                var cmd = Console.ReadLine();
                p.Commands.Add(cmd);
                var returnValue = p.Invoke();
                foreach (var v in returnValue)
                    Console.WriteLine(v.ToString());
            }
        }

        Console.WriteLine("End...");
        Console.ReadLine();

Я добавил ссылку dll на C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0\System.Management.Automation.dll на тот случай, если это не то, что вы используете.

И тогда это сработало. Поэтому я чувствую, что это не ваш код, а либо ваши учетные данные, либо удаленная установка на целевой машине.

person Juan Ayala    schedule 17.08.2012
comment
Я сказал да, потому что клиент и сервер находились в одной рабочей группе WORKGROUP. однако я создал домен на своем сервере и присоединил к нему клиента. но мой код дает ту же ошибку. Я запускаю все вышеперечисленные команды в командной строке, выдавая ошибку. Я не знаю, что я делаю. :( - person mary; 19.08.2012
comment
при какой команде вы получаете ошибку? можешь опубликовать ошибку? - person Juan Ayala; 20.08.2012
comment
Ошибка: 0x800f080c Имя компонента NetFx2-ServerCore неизвестно. Имя компонента Windows не было распознано. Используйте параметр /Get-Features, чтобы найти имя функции в образе, и повторите команду. Файл журнала DISM можно найти в C:\Windows\Logs\DISM\dism.log или выдает следующее: Ошибка: 0x800f080c Имя компонента MicrosoftWindowsPowerShell неизвестно. Имя компонента Windows не было распознано. Используйте параметр /Get-Features, чтобы найти имя функции в образе, и повторите команду. Файл журнала DISM можно найти в C:\Windows\Logs\DISM\dism.log, и другие похожи. - person mary; 22.08.2012
comment
Привет! Наконец-то разобрался. Это был номер порта в строке подключения. добавьте к нему :5985. Что касается шагов установки, если вы используете полную установку сервера 2008 (не ядро), пропустите шаги 1 и 2. - person Juan Ayala; 13.09.2012