1.引用 System.Management.Automation.dll
2.远程连接并打开服务器端 powershell
string admiName=@"服务器登录名称";
string adminPass="服务器密码";
//将string型密码转换为SecureString型
SecureString ssAdminPass=new SecureString();
foreach(var in adminPass)
{
ssAdminPass.AppendChar(s);
}
//将用户名密码封装为PSCredential
//等同于脚本语言
//$cred=New-Object System.Management.Automation.PSCredential -ArgumentList $account,$secpwd
var credentials=new PSCredential(adminName,ssAdminPass);
//与服务器端建立连接
var connecInfo=new WSManConnectionInfo(false,"服务器IP","wsman","http://schemas.microsoft.com/powershell/Microsoft.PowerShell",credentials);
Runspace runspace=RunspaceFactory.CreateRunspace(connecInfo);
try{
runspace.Open();
//编写脚本语言
using(var ps=PowerShell.Create()){
ps.Runspace=runspace;
//登录Exchange PowerShell
ps.addScript("$account=\"用户名\"");
ps.addScript("$secpwd=ConvertTo-SecureString '密码' -AsPlainText -Force");
ps.addScript("$cred=New-Object System.Management.Automation.PSCredential -ArgumentList $account,$secpwd");
ps.addScript("$session=New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://服务器名/powershell -Credential $cred");
//-AllowClobber可将远程命令覆盖本地命令,若不加可能会出错
ps.addScript("mport-PSSession $session -AllowClobber");
ps.Invoke();
//其他需要执行的命令 eg:Get-DistributionGroup
ps.AddScript("Get-DistributionGroup");
ps.Invoke();
}
}
3.直接使用远程 powershell 执行所有脚本,出现以下几个错误,仅供参考
(1)远程连接时可能会出现
需:客户端和服务端将IP加入到winrm中TrustedHosts
(2)若 Import-PSSession 后没有 -AllowClobber 参数,可能出现
(3)在脚本语句中使用 foreach 遍历获取的变量会出现脚本语句如下:
$dist=ForEach($group in (Get-DistributionGroup -ResultSize Unlimited))
{
Get-DistributionGroupMember -Identity $group | Select @{.....}
}
将变量 $group 传送给 get-member 将会看到以下内容
即 $group 变量中还包含着 Identity 属性,若想获得预期的结果需要引用变量中属性
$dist=ForEach($group in (Get-DistributionGroup -ResultSize Unlimited))
{
Get-DistributionGroupMember -Identity $group.Identity | Select @{.....}
}