[英]Unable to Run Admin PowerShell Commands Remotely with C#
我正在嘗試運行遠程PowerShell腳本以查詢並殺死在特定會話中運行的任務:
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
在results
變量(服務器XADCG上運行的進程的列表)中獲得正常的預期結果。
但是,如果我嘗試針對另一個會話運行查詢(例如query session user.name /server:xa11.mydomain.co.uk
),我的結果變量將返回空
檢查輸出了哪些錯誤后,我發現了以下內容:
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中包括身份驗證詳細信息時出現問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.