簡體   English   中英

無法使用C#遠程運行Admin PowerShell命令

[英]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();

如果我調用tasklistresultsresults變量(服務器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.Startrunas為這個用戶)

我是否還需要設置這些憑據,還是我的腳本中缺少其他內容?

感謝任何幫助

我可以使用以下腳本解決此問題:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM