【问题标题】:Run Powershell script that uses -List (parameter) with alternate credentials that运行 Powershell 脚本,该脚本使用 -List(参数)和备用凭据
【发布时间】:2016-08-21 02:06:16
【问题描述】:

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

我有一个 PowerShell 脚本,可以从基于 txt 的文件中读取计算机名称。通过以下单行从 PowerShell 会话运行时,它可以正常工作:

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

如您所见,它的文件名很长,所以用引号括起来。

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

对于另一个我没有使用的脚本,我知道我可以使用以下内容,它使用旧的 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) 的备用凭据启动脚本?我也很想保留我的目录结构,其中包括带空格的文件夹。该脚本的标题为:"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.

我几乎可以肯定这可以通过调用命令或启动进程来实现,这只是获取正确格式的问题吗?我可能在使用 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 automation parameter-passing invoke-command start-process


    【解决方案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
    
    • 使这项工作的关键是通过Start-Process-ArgumentList参数将所有参数作为数组传递给powershell.exe,这意味着参数必须是@987654327 @-分隔。

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

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

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

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

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

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

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

    简而言之:

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

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

    【讨论】:

      猜你喜欢
      • 2013-07-08
      • 2017-10-16
      • 2015-07-06
      • 1970-01-01
      • 2013-05-19
      • 2017-11-17
      • 2019-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多