运行使用 -List(参数)的 Powershell 脚本,该脚本具有备用凭据

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

提问人:Kenny 提问时间:4/27/2016 最后编辑:Kenny 更新时间:2/12/2017 访问量:1094

问:

我今天一直在努力让这个简单的 (?) 函数工作。

我有一个 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""}

那么,简而言之,如何让脚本使用从命令行读取参数 (-List) 的备用凭据启动?我也热衷于保留我的目录结构,其中包括带有空格的文件夹。该脚本的标题为:“服务器运行状况检查.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实现的,这只是获得正确格式的问题吗?我可能在使用 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 参数无效。我相信有一种方法可以做到这一点。

PowerShell 自动化 参数传递 invoke-command 启动进程

评论


答:

1赞 mklement0 4/27/2016 #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.exeStart-Process-ArgumentList,

    • 请注意,数组始终在表达式模式下被解析,这意味着文本字符串元素(如 和 )必须加引号-file-List
    • 通常,了解 PowerShell 的两种基本分析模式(参数模式和表达式模式)之间的区别非常重要,以及在以下情况下应用哪种模式 - 请参阅 https://technet.microsoft.com/en-us/library/hh847892.aspx
  • 添加以等待脚本完成; 默认情况下是异步的(所有命名的 PS cmdlet 都是异步的)。-WaitStart-ProcessStart-*

    • 注意事项:对于以其他用户身份调用的命令,只能从提升的提示符等待。
      如果不是,该命令仍将执行,但会异步执行,并且您将在当前控制台中收到错误消息;实际上,被忽略。
      Access denied-Wait
  • 仅当以其他用户身份运行时:如果要在当前控制台窗口中运行脚本,请添加; 默认情况下,为控制台应用程序(如 和 )打开一个新窗口。-NoNewWindow -WaitStart-Processpowershell.execmd.exe

    • 如果您确实以其他用户身份运行该命令,则会悄悄忽略。-NoNewWindow

至于原始症状以及为什么使用 Invoke-Command 以其他用户身份在本地运行命令是不明智的

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

    • 运行以查看涉及该参数的所有参数集。OP 的原始命令只有 ,但没有 ,这导致 PS 抱怨说没有参数集可以明确地识别。Get-Help Invoke-Command-Credential-Credential-ComputerName
  • 使用后,将始终使用 PowerShell 远程处理,即使将本地计算机指定为唯一目标计算机也是如此。-ComputerName.

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

总之:

  • 虽然您可以使用 执行纯本地调用,但不能以其他用户身份执行此操作,因为这总是涉及远程处理。Invoke-Command

  • Start-Process,相比之下,它仅用于在本地运行命令,可以选择以其他用户身份运行命令。