首页 > 代码库 > scvmm sdk之powershell(一)
scvmm sdk之powershell(一)
shell表示计算机操作系统中的壳层,与之相对的是内核,内核不能与用户直接交互,而是通过shell为用户提供操作界面,shell分为两类,一种提供命令行界面,一种提供图形界面。windows powershell第一个版本是在2006年,提供类似unix系统的命令行壳程程序。powershell是建立在.net framework基础之上的,它内置一百多种cmdlet工具,它不仅可以像传统cmd命令一样管理操作系统,还可以管理针对.net架构下开发的程序,比如system center virtual machine manager内置powershell。
下面我们来敲入两段简单,第一个获取当前系统时间,第二个获取windows以p开头的进程,第三个字母大小写转换。
我们还以用工具集来连接远程计算机。第一个行获取远程计算机登录权限,第二步来检查该计算机sql server服务是否启动。
1 $c=get-credential (get-credential -credential domain\administrator)2 Get-WmiObject -Query "select * from win32_service where name=‘mssqlserver‘" -computername 192.168.0.181 -credential $c
那么如何用powershell来管理scvmm,这里需要导入scvmm管理模块。可以用get-vm来获取hyperv中某一台名为linux的虚机。
更多的命令工具可以调用get-command来查看。
1 add-pssnapin "Microsoft.SystemCenter.VirtualMachineManager"2 get-vm -name linux -vmmserver 192.168.0.223
那么如果用代码去实现就需要用到System.Management.Automation.dll工具包。
可以在scvmm安装目录中找到或者C:\Program Files (x86)\Reference Assemblies\Microsoft\WindowsPowerShell类似路径下找到该程序集。
我们用它写一段代码。如果调用scvmm组件,可以将其用wcf部署在同一环境中,否则找不到依赖的组件。
1 public List<object> InvokeCmdByParamsWithReturn(string command, Dictionary<string, object> parameters, string module) 2 { 3 if (string.IsNullOrEmpty(command)) return null; 4 5 List<object> returnValue = http://www.mamicode.com/new List<object>(); 6 try 7 { 8 if (conn != null && conn.IsConnected) 9 {10 System.Management.Automation.Runspaces.PSSnapInException warning;11 System.Management.Automation.Runspaces.RunspaceConfiguration config = System.Management.Automation.Runspaces.RunspaceConfiguration.Create();12 if (!string.IsNullOrEmpty(module))13 config.AddPSSnapIn(module, out warning);14 System.Management.Automation.Runspaces.Runspace run = System.Management.Automation.Runspaces.RunspaceFactory.CreateRunspace(config);15 run.Open();16 using (System.Management.Automation.Runspaces.Pipeline pipeLine = run.CreatePipeline())17 {18 System.Management.Automation.Runspaces.Command cmd = new System.Management.Automation.Runspaces.Command(command);19 if ((parameters != null || parameters.Count > 0))20 {21 foreach (var p in parameters)22 {23 cmd.Parameters.Add(p.Key, p.Value);24 }25 }26 pipeLine.Commands.Add(cmd);27 var result = pipeLine.Invoke();28 if (result != null && result.Count > 0)29 {30 foreach (var obj in result)31 {32 StringBuilder sb = new StringBuilder();33 foreach (var item in obj.Members)34 {35 if (item.MemberType == System.Management.Automation.PSMemberTypes.Property)36 sb.Append(string.Format("{0}:{1},", item.Name, item.Value));37 }38 returnValue.Add(sb.ToString().Remove(sb.Length - 1, 1));39 }40 return returnValue;41 }42 }43 run.Close();44 }45 return null;46 }47 catch (Exception ex)48 {49 return null;50 throw new HostingManagementException(ex.Message, ex);51 }52 }
下面我们在客户端来调用它。第一个是获取bios环境信息,第二个我们来获取主机相关信息。
1 protected void Page_Load(object sender, EventArgs e) 2 { 3 ServiceReference1.VirtualMachineManagementServiceClient client = new ServiceReference1.VirtualMachineManagementServiceClient(); 4 client.Connect("192.168.0.223", 8100, "hf01\\administrator", "P@ssw0rd110"); 5 6 Dictionary<string, object> args = new Dictionary<string, object>(); 7 args.Add("class", "Win32_BIOS"); 8 var query = client.InvokeCmdByParamsWithReturn("Get-WmiObject", args, ""); 9 10 args = new Dictionary<string, object>();11 args.Add("vmmserver", "192.168.0.223");12 var query2 = client.InvokeCmdByParamsWithReturn("get-vmhost", args, "Microsoft.SystemCenter.VirtualMachineManager");13 14 client.Disconnect();15 client.Close();16 }
运行结果。