运行 使用 -List(参数)和备用凭据的 Powershell 脚本

Run Powershell script that uses -List (parameter) with alternate credentials that

今天我一直在努力让这个简单的(?)功能正常工作。

我有一个从 txt-based 文件中读取计算机名称的 PowerShell 脚本。当通过以下 one-liner:

从 PowerShell session 运行 时,它工作正常
./"Server Health Check.ps1" -List One-off.txt

如您所见,文件名很长,因此用引号引起来。

但是,我正在构建一个带有单选框的 PowerShell GUI 表单,该单选框将传递用于调用脚本的文本文件的选择。诀窍是,脚本需要 运行 和 备用 管理员帐户,我不清楚如何让它工作。

对于我得到的另一个不使用的脚本,我知道我可以使用以下内容,它使用旧的 DOS "runas",但是,它不适用于-列表功能。

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

那么,简而言之,如何使用从命令行读取参数 (-List) 的备用凭据启动脚本?我也热衷于保留我的目录结构,其中包括带空格的文件夹。脚本标题为:"Server health 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 的 do-able,只是格式正确的问题?我可能在 start-process 或 invoke-command.

的试验中某处遗漏了 / 或 ' 或 ""

感谢任何帮助!

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 参数无效。我确定有办法做到这一点。

注:需求明确后完全重写

运行命令作为不同的用户在本地,使用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
  • 完成这项工作的关键是通过 Start-Process 将所有参数作为 array 传递给 powershell.exe -ArgumentList参数,表示参数必须,-分隔。

    • 注意数组总是在表达式模式下解析,这意味着-file-List等文字字符串元素必须是引用.
    • 了解 PowerShell 的两种基本解析模式 参数模式 表达式模式 之间的区别通常很重要适用于 - 参见 https://technet.microsoft.com/en-us/library/hh847892.aspx
  • 添加-Wait等待脚本完成; Start-Process 默认是 异步 (所有 PS cmdlet 命名为 Start-* 都是)。

    • 警告:对于以不同用户身份调用的命令,您只能在 提升的 提示符下等待。
      如果不是,该命令仍会执行,但会异步执行,并且您会在当前控制台中收到 Access denied 错误消息;实际上,-Wait 被忽略了。
  • 仅当 不是 运行宁作为不同的用户时:添加 -NoNewWindow -Wait 如果你想 运行 当前控制台window中的脚本; Start-Process 默认为 powershell.execmd.exe.

    等控制台应用程序打开一个新的 window
    • 如果您以不同的用户执行 运行 命令,-NoNewWindow 将被忽略。

至于最初的症状和为什么不建议在本地使用Invoke-Command到运行命令作为不同的用户:

  • Invoke-Command -Credential ... 要求也指定 -ComputerName 参数。

    • 运行 Get-Help Invoke-Command 查看所有涉及 -Credential 参数的参数集。 OP 的原始命令只有 -Credential,但没有 -ComputerName,这导致 PS 抱怨无法明确识别任何参数集。
  • 一旦您使用 -ComputerName,PowerShell remoting 总是被使用,即使您指定 . - local 计算机 - 作为唯一的目标计算机。

    • 使用远程处理有两个含义:
      • 远程处理默认不可用,必须在目标计算机(在本例中为本地计算机)上配置。
      • 使用远程处理需要使用 admin 权限进行调用。

简而言之:

  • 虽然您可以使用Invoke-Command执行纯本地调用,但您不能作为另一个用户 ],因为这总是涉及远程处理。

  • Start-Process,相比之下,只存在于 运行 命令 locally,可选择作为不同的用户。