如何以管理员身份运行PowerShell并使用批处理文件中的参数?

时间:2016-11-03 20:33:43

标签: powershell batch-file cmd

我已经分别找到了这两项任务的答案,但没有找到答案:

  • 从批处理文件中以管理员身份运行PowerShell

  • 从批处理文件中运行带参数的PowerShell

但我想从批处理文件中以管理员 AND 使用参数运行PowerShell

出于这个原因,我确信到目前为止还没有重复。

由于这个原因,这个问题很复杂:

我在运行提升的PowerShell时使用ArgumentList开关指向文件路径。我也用它来传递参数。另外,我已成功使用此开关。看起来好像我可以将它用于这两个任务。

以下是我目前使用PowerShell的方式:

作为管理员:

powershell -Command "& {Start-Process powershell -ArgumentList '-File "filePath.ps1' -Verb RunAs}"

带参数:

powershell -ExecutionPolicy unrestricted Import-Module "filePath.ps1" -ArgumentList "arg1","arg2"

我尝试过的事情:

我尝试将我的参数添加到传入文件的ArgumentList,但它们无法识别。

我也尝试将-Verb RunAs添加到工作参数行,但PowerShell认为我试图传递另一个名为Verb的参数,并且无法以管理员身份运行PowerShell。

是否有可能以管理员身份运行PowerShell,并通过参数,通过切换我传递参数的方式,或者我如何提升PowerShell来实现?

4 个答案:

答案 0 :(得分:5)

可以在没有第三方工具的情况下解决您的问题,但解决方案有些神秘。

因此,请考虑下载Bill Stewart的有用的elevate32elevate64工具,如his answer中所述,这简化了解决方案。 < / p>

这是一个简单的示例,它在从cmd.exe(或批处理文件)启动的提升的PowerShell会话中调用带有参数的Get-Date cmdlet:

powershell -command "Start-Process -verb runas powershell" "'-noexit -command get-date -UFormat %s'"

注意如何将命令行传递给中间-command参数创建的提升 PowerShell会话,并将其作为单个参数传递嵌入式单引号

引用可能会变得棘手,但这种方法原则上也适用于调用*.ps1文件:

  • powershell -command "Start-Process -verb runas powershell"是命令行的不变部分。

  • 剩余的"..." - 附加字符串必须包含嵌套单个字符串,其中包含PowerShell识别的引号(单引号最简单),其中包含所有参数您将直接传递给powershell ...命令行调用。

应用于您的示例:

... "'-File C:\path\to\filePath.ps1 arg1 arg2'"

注意:请务必使用完整路径到您的脚本文件,因为提升的PowerShell会话(必然)运行与调用会话相同的目录。

如果您需要引用嵌套字符串中的参数,请使用\"

... "'-File \"c:\path with spaces\to\filePath.ps1\" arg1 arg2'"

答案 1 :(得分:4)

您可以通过获取我编写的名为Elevate32.exe的简短命令行可执行文件(或64位版本的Elevate64.exe)来执行此操作。你可以在这里得到它:

http://www.westmesatech.com/misctools.html(ElevationToolkit1.zip)

示例:

elevate64 -- powershell.exe -file C:\scripts\myscriptfile.ps1

--之后的所有内容都是您想要提升的命令行。

答案 2 :(得分:0)

如果您恰好拥有着名的NirCmd NirSoft,那么您的服务中有一个很好的elevate命令(以及更多的命令)。

nircmd elevate powershell.exe -File script.ps1 arg1 arg2 ...

NirCmd 提供x86和x64版本的免费版本,与 NirSoft 中的所有软件一样免费。

答案 3 :(得分:0)

Mi解决了一个自我提升的脚本。如果未使用管理员权限执行。该脚本检查管理员角色并以管理员身份执行。

从浴文件(* .bat)运行Script.ps1

Powershell Core

pwsh.exe -NoLogo -ExecutionPolicy Bypass -Command "./Script.ps1 -Param1 Hello -Param2 World"

pwsh.exe -NoLogo -ExecutionPolicy Bypass -Command "path-to-script/Script.ps1 -Param1 Hello -Param2 World"

Powershell

powershell.exe -NoLogo -ExecutionPolicy Bypass -Command "./Script.ps1 -Param1 Hello -Param2 World"

powershell.exe -NoLogo -ExecutionPolicy Bypass -Command "path-to-script/Script.ps1 -Param1 Hello -Param2 World"

Script.ps1代码

param(
    [Parameter(Mandatory=$True, Position=0, ValueFromPipeline=$false)]
    [System.String]
    $Param1,

    [Parameter(Mandatory=$True, Position=1, ValueFromPipeline=$false)]
    [System.String]
    $Param2
)

if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) 
{ 
    Start-Process pwsh "-NoLogo -ExecutionPolicy Bypass -Command $PSCommandPath -Param1 $Param1 -Param2 $Param2" -Verb RunAs; # //Run this script as Administrator.
    exit # //Exit from this non elevated context.
}

# // Executed in elevated Mode
Write-Host $Param1
Write-Host $Param2