1

我很努力使今天能夠使用這個簡單的(?)函數。運行Powershell腳本,使用-list(參數)替代憑證

我有一個PowerShell腳本從基於txt的文件讀取計算機名稱。通過下面的一行從PowerShell會話中運行時,它工作正常:

./"Server Health Check.ps1" -List One-off.txt 

正如你所看到的,它有一個長文件名,所以它包裹着行情。

但是,我正在構建一個PowerShell GUI窗體,其中包含一個用於調用腳本的文本文件的選項。訣竅是,腳本需要與替代管理員帳戶運行,我不清楚如何使這項工作。

對於另一個腳本我沒有使用我知道我可以使用下面的行,這使用舊的DOS「runas」,但是,它不能與-list功能一起使用。

invoke-command -scriptblock {runas.exe /user:domain\$Env:Username"admin" "powershell.exe -file \"\\Server\c$\LONG FOLDER\Server Health Check.PS1""} 

因此,概括地說,如何讓一個腳本與讀取命令行參數( - 列出)備用憑據啓動?我也熱衷於保存我的目錄結構,其中包括帶空格的文件夾。該腳本的標題是:「服務器健康check.ps1」

我想的最後一件事是在下列

$ScriptPath = "C:\SCRIPTS FOLDER\Server Health Check.ps1" 
$ArgList = "-List C:\SCRIPTS FOLDER\One-off.txt" 
Invoke-Command -filepath $ScriptPath -Credential DragonBallDomain\$Env:UserName"Admin" -ArgumentList $ArgList 

結果是以下消息:

Invoke-Command : Parameter set cannot be resolved using the specified named parameters. 

我幾乎可以肯定,這可以通過invoke-command或start-process來實現,這只是獲得正確格式的問題?我可能在啓動過程或調用命令的嘗試中丟失了/或「或」。

任何幫助表示讚賞!

更新4月30日:

我已經嘗試了一些更使這項工作,我很接近,但仍然不能令人信服。

$LongScriptPath = resolve-path Script.ps1 
$LongFolderPath = \\UNC\PATH TO FOLDER\WITH LONG NAME\ 
start-process -filepath powershell.exe -argumentlist " -file``"$($FilePath.path)`"" -cred DOMAIN\USERID -WorkingDirectory "$LongFolderPath" 

添加-credential是導致錯誤的原因,該錯誤指出-file參數無效。我確信有一種方法可以做到這一點。

回答

1

注意:需求變得更清晰後完全重寫。

運行命令爲不同的用戶本地,使用Start-Process -Credential ...

也就是說你嘗試在你的原則是什麼更新,但也有問題,你是如何傳遞參數;嘗試這個代替:

$LongScriptPath = resolve-path Script.ps1 
$LongFolderPath = '\\UNC\PATH TO FOLDER\WITH LONG NAME\' 
start-process ` 
    powershell.exe ` 
    -ArgumentList '-file', $LongScriptPath, '-List', 'One-off.txt' ` 
    -Credential DOMAIN\USERID ` 
    -WorkingDirectory $LongFolderPath 
  • 在進行此工作的關鍵是通過所有參數傳遞給powershell.exe經由Start-Process-ArgumentList參數,這意味着該參數必須,一個陣列 - 分離。

    • 注意如何陣列在表達模式,這意味着,文字串的元素如-file-List必須引述總是解析。
    • 瞭解參數模式表達模式 PowerShell的兩個基本的解析模式之間的區別,這是一般的重要,當它被應用 - 見https://technet.microsoft.com/en-us/library/hh847892.aspx
  • 添加-Wait等待腳本完成; Start-Process默認爲異步(所有PS cmdlet都命名爲Start-*)。

    • 警告:對於援引爲不同的用戶命令,則只能從升高提示等待。
      如果不是,該命令仍然會執行,但會異步執行,並且您將在當前控制檯中收到Access denied錯誤消息;實際上,-Wait被忽略。
  • 只有運行作爲不同的用戶:添加-NoNewWindow -Wait如果你想運行在當前控制檯窗口的腳本; Start-Process默認爲控制檯應用程序打開一個新窗口,如powershell.execmd.exe

    • 如果確實以其他用戶身份運行該命令,則會默認忽略-NoNewWindow

至於原來的症狀和爲什麼使用Invoke-Command在本地運行一個命令爲不同的用戶是不明智的

  • Invoke-Command -Credential ...要求-ComputerName參數也要指定。

    • 運行Get-Help Invoke-Command查看涉及參數-Credential的所有參數集。 OP的原始命令只有-Credential,但不是-ComputerName,這導致PS抱怨沒有參數集可以明確標識。
  • 一旦你使用-ComputerName,PowerShell的遠程不變地使用,即使您指定. - 在本地計算機 - 作爲唯一計算機的目標。

    • 使用遠程有兩層含義:
      • Remoting是不是默認情況下可用,並且必須在目標計算機上配置(本地計算機,在這種情況下)。
      • 使用遠程處理需要調用admin權限。

簡而言之:

  • 雖然你可以Invoke-Command進行純粹的本地調用,你不能這樣做作爲另一個用戶,因爲這不可避免地涉及遠程處理。

  • Start-Process,相比之下,單獨存在來運行命令局部,任選地作爲一個不同的用戶。