无法 运行 使用 C# 远程管理 PowerShell 命令
Unable to Run Admin PowerShell Commands Remotely with C#
我正在尝试 运行 一个远程 PowerShell 脚本来查询和终止特定会话中 运行ning 的任务:
string hostname = "XADCG.mydomain.co.uk";
string script = "$pw = convertto-securestring -AsPlainText -Force -String password123 " + Environment.NewLine +
"$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist \"DOMAIN1\zzkillcitrix\",$pw" + Environment.NewLine +
"$sessions = New-PSSession -ComputerName " + hostname + " -credential $cred" + Environment.NewLine +
"Invoke-Command -session $sessions -ScriptBlock {taskkill /s xa7-11.mydomain.co.uk /PID 26208 /F}" + Environment.NewLine +
"Remove-PSSession -Session $sessions" + Environment.NewLine +
"exit";
// Create and open runspace
Runspace runspace = RunspaceFactory.CreateRunspace();
runspace.Open();
// Create piepeline and feed it the script text
Pipeline pipeline = runspace.CreatePipeline();
pipeline.Commands.AddScript(script);
Collection<PSObject> results = new Collection<PSObject>();
try
{
results = pipeline.Invoke();
var error = pipeline.Error.Read();
}
catch (Exception ex)
{
results.Add(new PSObject((object)ex.Message));
}
runspace.Close();
如果我调用 tasklist
,我会在 results
变量中得到正常的预期结果(进程列表 运行ning 在服务器 XADCG 上)
但是,如果我尝试 运行 查询另一个会话(例如 query session user.name /server:xa11.mydomain.co.uk
),我的结果变量 returns 为空
查看输出了哪些错误,我发现如下:
taskkill /s xa11.mydomain.co.uk /pid 5876 /F
{ERROR: Logon failure: unknown user name or bad password.}
query session user.name /server:xa11.mydomain.co.uk
{Error 5 getting sessionnames}
tasklist /s xa7-11.mydomain.co.uk /fi \"SESSION EQ 4\"
{ERROR: Logon failure: unknown user name or bad password.}
这显然让我似乎使用了错误的用户名/密码,但我 100% 确定这些在 $cred 变量中设置正确
我还可以确认帐户 zzkillcitrix
确实有权远程 运行 这些查询(我可以通过调用 Process.Start
来执行所有这些命令 runas
对于这个用户)
我是否需要在其他地方设置这些凭据,或者我的脚本中是否缺少其他内容?
感谢任何帮助
我能够使用以下脚本解决此问题:
string hostname = "SERVER.Domain.co.uk";
string script = "$pw = convertto-securestring -AsPlainText -Force -String \"PASSWORD\"" + Environment.NewLine +
"$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist \"Domain1\zzkillcitrix\",$pw" + Environment.NewLine +
"$sessions = New-PSSession -ComputerName " + hostname + " -credential $cred" + Environment.NewLine +
"Invoke-Command -session $sessions -ScriptBlock {taskkill /s xa7-11.Domain1.co.uk /pid 23736 /U Domain1\zzkillcitrix /P PASSWORD /F }" + Environment.NewLine +
"Remove-PSSession -Session $sessions" + Environment.NewLine +
"exit";
Runspace runspace = RunspaceFactory.CreateRunspace();
runspace.Open();
Pipeline pipeline = runspace.CreatePipeline();
pipeline.Commands.AddScript(script);
Collection<PSObject> results = new Collection<PSObject>();
try
{
results = pipeline.Invoke();
var errors = pipeline.Error.Read(pipeline.Error.Count);
foreach (var error in errors)
{
var y = error;
}
}
catch (Exception ex)
{
results.Add(new PSObject((object)ex.Message));
}
runspace.Close();
所以我需要在使用 $sessions
变量创建 New-PSSession
时进行身份验证,然后在调用实际命令时再次进行身份验证:
"Invoke-Command -session $sessions -ScriptBlock {taskkill /s xa7-11.Domain1.co.uk /pid 23736 /U Domain1\zzkillcitrix /P PASSWORD /F }" + Environment.NewLine +
我仍然不明白为什么我能够在不提供凭据的情况下从同一台服务器的 PowerShell 手动 运行 该命令,但这是有道理的,因为我正在远程处理 到 服务器 $sessions
然后远程退出,当在 ScriptBlock 中包含身份验证详细信息时进入有问题的会话。
我正在尝试 运行 一个远程 PowerShell 脚本来查询和终止特定会话中 运行ning 的任务:
string hostname = "XADCG.mydomain.co.uk";
string script = "$pw = convertto-securestring -AsPlainText -Force -String password123 " + Environment.NewLine +
"$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist \"DOMAIN1\zzkillcitrix\",$pw" + Environment.NewLine +
"$sessions = New-PSSession -ComputerName " + hostname + " -credential $cred" + Environment.NewLine +
"Invoke-Command -session $sessions -ScriptBlock {taskkill /s xa7-11.mydomain.co.uk /PID 26208 /F}" + Environment.NewLine +
"Remove-PSSession -Session $sessions" + Environment.NewLine +
"exit";
// Create and open runspace
Runspace runspace = RunspaceFactory.CreateRunspace();
runspace.Open();
// Create piepeline and feed it the script text
Pipeline pipeline = runspace.CreatePipeline();
pipeline.Commands.AddScript(script);
Collection<PSObject> results = new Collection<PSObject>();
try
{
results = pipeline.Invoke();
var error = pipeline.Error.Read();
}
catch (Exception ex)
{
results.Add(new PSObject((object)ex.Message));
}
runspace.Close();
如果我调用 tasklist
,我会在 results
变量中得到正常的预期结果(进程列表 运行ning 在服务器 XADCG 上)
但是,如果我尝试 运行 查询另一个会话(例如 query session user.name /server:xa11.mydomain.co.uk
),我的结果变量 returns 为空
查看输出了哪些错误,我发现如下:
taskkill /s xa11.mydomain.co.uk /pid 5876 /F
{ERROR: Logon failure: unknown user name or bad password.}
query session user.name /server:xa11.mydomain.co.uk
{Error 5 getting sessionnames}
tasklist /s xa7-11.mydomain.co.uk /fi \"SESSION EQ 4\"
{ERROR: Logon failure: unknown user name or bad password.}
这显然让我似乎使用了错误的用户名/密码,但我 100% 确定这些在 $cred 变量中设置正确
我还可以确认帐户 zzkillcitrix
确实有权远程 运行 这些查询(我可以通过调用 Process.Start
来执行所有这些命令 runas
对于这个用户)
我是否需要在其他地方设置这些凭据,或者我的脚本中是否缺少其他内容?
感谢任何帮助
我能够使用以下脚本解决此问题:
string hostname = "SERVER.Domain.co.uk";
string script = "$pw = convertto-securestring -AsPlainText -Force -String \"PASSWORD\"" + Environment.NewLine +
"$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist \"Domain1\zzkillcitrix\",$pw" + Environment.NewLine +
"$sessions = New-PSSession -ComputerName " + hostname + " -credential $cred" + Environment.NewLine +
"Invoke-Command -session $sessions -ScriptBlock {taskkill /s xa7-11.Domain1.co.uk /pid 23736 /U Domain1\zzkillcitrix /P PASSWORD /F }" + Environment.NewLine +
"Remove-PSSession -Session $sessions" + Environment.NewLine +
"exit";
Runspace runspace = RunspaceFactory.CreateRunspace();
runspace.Open();
Pipeline pipeline = runspace.CreatePipeline();
pipeline.Commands.AddScript(script);
Collection<PSObject> results = new Collection<PSObject>();
try
{
results = pipeline.Invoke();
var errors = pipeline.Error.Read(pipeline.Error.Count);
foreach (var error in errors)
{
var y = error;
}
}
catch (Exception ex)
{
results.Add(new PSObject((object)ex.Message));
}
runspace.Close();
所以我需要在使用 $sessions
变量创建 New-PSSession
时进行身份验证,然后在调用实际命令时再次进行身份验证:
"Invoke-Command -session $sessions -ScriptBlock {taskkill /s xa7-11.Domain1.co.uk /pid 23736 /U Domain1\zzkillcitrix /P PASSWORD /F }" + Environment.NewLine +
我仍然不明白为什么我能够在不提供凭据的情况下从同一台服务器的 PowerShell 手动 运行 该命令,但这是有道理的,因为我正在远程处理 到 服务器 $sessions
然后远程退出,当在 ScriptBlock 中包含身份验证详细信息时进入有问题的会话。