2013-11-25 3 views
7

मैं निम्नलिखित कोड का उपयोग कर सी # से एक स्क्रिप्ट localwindows.ps1 चलाने का भी प्रयास से एक powershell स्क्रिप्ट फ़ाइल (example.ps1) कॉल करने के लिए \ localwindows .ps1 'को cmdlet, फ़ंक्शन, स्क्रिप्ट फ़ाइल या ऑपरेट करने योग्य प्रोग्राम के नाम के रूप में पहचाना नहीं गया है।सी #

PSCredential credential = new PSCredential(userName, securePassword); 
WSManConnectionInfo connectionInfo = new WSManConnectionInfo(false, "machineName", 5985, "/wsman", shellUri, credential); 
using (Runspace runspace = RunspaceFactory.CreateRunspace(connectionInfo)) 
{ 

    runspace.Open(); 

    using (PowerShell powershell = PowerShell.Create()) 
    { 
     powershell.Runspace = runspace;   

     PSCommand new1 = new PSCommand(); 
     String machinename = "machinename"; 
     String file = "C:\\localwindows.ps1"; 
     new1.AddCommand("Invoke-Command"); 
     new1.AddParameter("computername", machinename); 
     new1.AddParameter("filepath", file);   


     powershell.Commands = new1; 
     Console.WriteLine(powershell.Commands.ToString()); 
     Collection<PSObject> results = powershell.Invoke(); 

    } 

मैं त्रुटि हो रही है:

तो मैं निम्नलिखित की कोशिश की "पथ नहीं ढूंढा जा सकता 'C: \ localwindows.ps1'। क्योंकि यह मौजूद नहीं है"

लेकिन स्थानीय मशीन में पावरहेल से कमांड 'Invoke-Command -ComputerName "मशीन नाम" -फाइलपाथ सी: \ localwindows.ps1' का उपयोग करके, दूरस्थ मशीन में एक नया खाता बनाया गया।

सी # से स्थानीयwindows.ps1 स्क्रिप्ट को कैसे कॉल करें? सी # के माध्यम से 'Invoke-Command -ComputerName' मशीन नाम "-फाइलपाथ सी: \ localwindows.ps1 'आदेश को निष्पादित करने के लिए कैसे करें?

स्क्रिप्ट localwindows.ps1

$comp = [adsi]“WinNT://machinename,computer” 
$user = $comp.Create(“User”, "account3") 
$user.SetPassword(“change,password.10") 
$user.SetInfo() 

उत्तर

3

वास्तव में अपने मंगलाचरण शैली काम करना चाहिए है। लेकिन आपके दोनों उदाहरणों में, स्क्रिप्ट c:\localwindows.ps1 स्थानीय कंप्यूटर पर रहना चाहिए। Invoke-Command मामले में, इसे स्थानीय कंप्यूटर से दूरस्थ कंप्यूटर पर कॉपी किया जाएगा।

हैं, आह्वान-कमान मामले में, स्क्रिप्ट पहले से ही दूरस्थ कंप्यूटर पर मौजूद है और आप FilePath पैरामीटर को निकालने के लिए, उस पर नकल करने की जरूरत है और इस में शामिल न करें:

new1.AddParameter("Scriptblock", ScriptBlock.Create(file)); 
+0

मैंने केस पाइपलाइन की कोशिश की। टिप्पणियाँ। एडस्क्रिप्ट (System.IO.File.ReadAllText (फ़ाइल)); मुझे त्रुटि मिल रही है: 'अप्रत्याशित टोकन' विन: // machineName 'अभिव्यक्ति या कथन में।' जबकि वही स्क्रिप्ट invoke-command के साथ स्थानीय उपयोगकर्ता खाता बनाता है। मैंने समाधान की कोशिश की - पाइपलाइन। कॉमांड। एडस्क्रिप्ट (System.IO.File.ReadAllText ("।" फ़ाइल)); प्रोग्राम फ़ाइल का पता लगाने में सक्षम नहीं था। –

+0

मैंने कोशिश की - new1.AddParameter ("Scriptblock", "{।" + File + "}"); मुझे त्रुटि मिल रही है - 'स्क्रिप्टब्लॉक' पैरामीटर बाध्य नहीं कर सकता। "System.Management.Automation.ScriptBlock" टाइप करने के लिए "{C: \ localwindows.ps1}" प्रकार "System.String" प्रकार का मान परिवर्तित नहीं कर सकता। ' –

+0

अद्यतन उत्तर देखें।मेरा मानना ​​है कि आपकी समस्या का क्रूक्स यह है कि स्क्रिप्ट आपके स्थानीय कंप्यूटर पर 'c: \ localwindows.ps1' पर नहीं है। –

0

मैंने एक आलेख मिला जो WinRM के माध्यम से Powershell को .NET से http://getthinktank.com/2015/06/22/naos-winrm-windows-remote-management-through-net/ पर चलाने का एक आसान तरीका बताता है।

कोड एक ही फ़ाइल में है यदि आप इसे कॉपी करना चाहते हैं और यह एक NuGet पैकेज भी है जिसमें System.Management.Automation का संदर्भ शामिल है।

यह स्वतः विश्वसनीय होस्ट प्रबंधित करता है, स्क्रिप्ट ब्लॉक चला सकता है, और फाइलें भी भेज सकता है (जो वास्तव में समर्थित नहीं है लेकिन मैंने चारों ओर एक काम बनाया है)। रिटर्न हमेशा पावरहेल से कच्चे माल होते हैं।

// this is the entrypoint to interact with the system (interfaced for testing). 
var machineManager = new MachineManager(
    "10.0.0.1", 
    "Administrator", 
    MachineManager.ConvertStringToSecureString("xxx"), 
    true); 

// for your specific issue I think this would be easier 
var results = machineManager.RunScript(
    File.ReadAllText("C:\\LocalWindows.ps1")); 

// will perform a user initiated reboot. 
machineManager.Reboot(); 

// can run random script blocks WITH parameters. 
var fileObjects = machineManager.RunScript(
    "{ param($path) ls $path }", 
    new[] { @"C:\PathToList" }); 

// can transfer files to the remote server (over WinRM's protocol!). 
var localFilePath = @"D:\Temp\BigFileLocal.nupkg"; 
var fileBytes = File.ReadAllBytes(localFilePath); 
var remoteFilePath = @"D:\Temp\BigFileRemote.nupkg"; 
machineManager.SendFile(remoteFilePath, fileBytes); 

अगर यह मदद करता है तो कृपया उत्तर के रूप में चिह्नित करें। मैं अपने स्वचालित तैनाती के साथ थोड़ी देर के लिए इसका उपयोग कर रहा हूं। यदि आपको समस्याएं मिलती हैं तो कृपया टिप्पणियां छोड़ दें।