尝试使用runas管理员使用PowerShell运行.bat文件时出错

时间:2017-02-11 01:23:08

标签: powershell batch-file

我可以右键单击DEC16.bat文件,它将运行。我在脚本中包含它以从闪存驱动器运行时遇到问题。 PowerShell脚本基本上将一堆安装文件复制到客户端的计算机上。

Windows PowerShell
Copyright (C) 2013 Microsoft Corporation. All rights reserved.

PS H:\> $script = "\\xxxhsfmsl03\adap\Database\Install\AugKA\DEC16.bat"
PS H:\>
PS H:\> Start-Process powershell -Credential “xxx\xxxvis_desktop” -ArgumentList '-noprofile -command &{Start-Process $script -verb runas}'
Start-Process : This command cannot be run due to the error: The directory name is invalid.
At line:1 char:1
+ Start-Process powershell -Credential “xxx\xxxvis_desktop” -ArgumentList '-noprof ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Start-Process], InvalidOperationException
    + FullyQualifiedErrorId : InvalidOperationException,Microsoft.PowerShell.Commands.StartProcessCommand

PS H:\> $script
\\xxxhsfmsl03\adap\Database\Install\AugKA\DEC16.bat
PS H:\>

(我已插入“xxx”以保护无辜者)

1 个答案:

答案 0 :(得分:0)

尝试以下方法:

Start-Process powershell `
   -WorkingDirectory (Split-Path $script) `
   -Credential xxx\xxxvis_desktop `
   -ArgumentList '-noprofile', '-command', "
     & { start-process powershell -ArgumentList '-File', '$script' -Verb RunAs }
     "
  • 您的主要问题很可能是目标用户 - xxx\xxxvis_desktop - 在调用时缺少访问恰好是当前目录的权限< /强>

    • 将工作目录明确设置为目标用户 允许访问的目录应解决该问题 - -WorkingDirectory (Split-Path $script)设置工作目录。到了.dir。目标脚本所在的位置。
  • 您的第二个问题 - 正如Matt对问题的评论中指出的那样 - 是您传递给Start-Process命令字符串括在'...'引号)中,导致嵌入的$script变量引用被展开(插值)。

    • 使用"..." double 引号)修复了该问题; 请注意,要传递给{{1}的命令行可执行文件被拆分为通过powershell传递的单个参数 - (文字,单引号)选项,后跟(插值,双引号)命令字符串,这是更好的方法传递参数,因为它更健壮。

    • 注意,命令字符串中的-ArgumentList引用如何包含在 embedded $string中,以确保在调用的'...'实例时解析命令字符串时,powershell的值被识别为单个参数(尽管这对于手头的值$string来说不是必需的)。

      • 如果\\xxxhsfmsl03\adap\Database\Install\AugKA\DEC16.bat的值有可能嵌入了$script个实例,则必须使用以下内容(将'个实例加倍来转义它们):
        '
  • 最后一个问题是您无法直接在脚本上使用$($script -replace "'", "''") - 就像在外部通话中一样,您需要调用Start-Process并将其传递给脚本文件名作为参数。

附加说明:

  • 命令字符串中powershell调用周围的& { ... }包装器不是必需的。

  • 通常情况下,您可以使用{em>单 start-process来调用Start-Process来提升-Verb RunAs的运行速度,但不幸的是,{{1} }}和$script无法合并,因此意味着:

    • 如果当前用户是管理帐户,则提升的会话将始终以该用户身份运行 - 您只需获得是/否提示即可确认提升。
    • 否则,系统会提示您输入凭据,但您无法在该对话框中预填充用户名。

    • -Verb RunAs