เชื่อมต่อระยะไกลกับ PowerShell จาก C #

ฉันต้องการเชื่อมต่อ 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 และได้รับคำตอบว่า HTTP URL ที่ร้องขอไม่พร้อมใช้งาน ซึ่งมักจะส่งคืนโดยเซิร์ฟเวอร์ HTTP โดยเซิร์ฟเวอร์ HTTP ที่ไม่รองรับโปรโตคอล WS_management ฉันค้นหาเกี่ยวกับมันและวิธีแก้ปัญหาของพวกเขาคือ: เรียกใช้ WinRM Quickconfig ในเซิร์ฟเวอร์และในตัวจัดการ IIS ในเว็บไซต์เริ่มต้น/การแก้ไขการเชื่อมโยง: ลบชื่อโฮสต์ของพอร์ต 80 ฉันทำมันแต่ไม่ได้เปลี่ยนแปลง   -  person mary    schedule 17.08.2012


คำตอบ (1)


ตกลง คุณบอกว่าทั้งสองเครื่องอยู่ในโดเมนเดียวกัน แต่ฉันเห็นว่าคุณกำลังพยายามใช้บัญชีผู้ดูแลระบบในเครื่อง นั่นอาจเป็นปัญหาแต่ไม่จำเป็น เพื่อทำซ้ำสิ่งนี้ ฉันตั้งค่า Win2k8R2 บน VM และทำตามขั้นตอนต่อไปนี้:

ขั้นตอน #1&2 ใช้กับการติดตั้ง Server 2008 R2 Core หากคุณมีการติดตั้งแบบเต็ม เพียงข้ามไปที่ #3

  1. Run following commands to Install .NET2 & PowerShell (within cmd.exe)
    • DISM /Online /Enable-Feature /Featurename:NetFx2-ServerCore
    • DISM /ออนไลน์ /เปิดใช้งานคุณลักษณะ /FeatureName:MicrosoftWindowsPowerShell
  2. Install some useful PS CmdLets (within cmd.exe)
    • DISM /online /enable-feature /featurename=ServerManager-PSH-Cmdlets
    • DISM /ออนไลน์ /enable-feature /featurename=BestPractices-PSH-Cmdlets
  3. Enable Remote Shell (within powershell.exe)
    • Set-Excutionpolicy RemoteSigend
    • กำหนดค่า-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 เดียวกัน อย่างไรก็ตาม ฉันสร้างโดเมนในเซิร์ฟเวอร์ของฉันและเข้าร่วมกับลูกค้า แต่รหัสของฉันให้ข้อผิดพลาดเดียวกัน ฉันรัน cammand ทั้งหมดข้างต้นใน command prompt ให้ข้อผิดพลาด ฉันไม่รู้ว่าฉันทำอะไร :( - 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