1

我今天很难让这个简单的(?)功能正常工作。

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

我几乎可以肯定这可以通过调用命令或启动过程来实现,这只是获取正确格式的问题吗?我可能在使用 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 参数无效。我确信有办法做到这一点。

4

1 回答 1

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
  • 完成这项工作的关键是通过's参数传递所有要powershell.exe作为数组传递的参数,这意味着参数必须是 -分隔的。Start-Process-ArgumentList,

    • 请注意数组总是在表达式模式下解析的,这意味着文字字符串元素,例如-fileand-List必须被引用
    • 一般来说,了解 PowerShell 的两种基本解析模式(参数模式表达式模式)之间的区别很重要,并且在何时应用 - 请参阅https://technet.microsoft.com/en-us/library/hh847892.aspx
  • 添加-Wait以等待脚本完成;Start-Process默认情况下是异步的(所有命名的 PS cmdletStart-*都是)。

    • 警告:对于以不同用户身份调用的命令,您只能在提升的提示符下等待。
      如果不是,该命令仍将执行,但会异步执行,并且您将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 抱怨无法明确识别任何参数集。
  • 一旦您使用-ComputerNamePowerShell远程处理,即使您指定.-本地计算机 - 作为唯一目标计算机也是如此。

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

简而言之:

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

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

于 2016-04-27T03:10:34.737 回答