以管理员用户身份重新启动 PowerShell 脚本

Posted

技术标签:

【中文标题】以管理员用户身份重新启动 PowerShell 脚本【英文标题】:Relaunching PowerShell script as admin user 【发布时间】:2016-10-12 12:40:57 【问题描述】:

我有很多计算机系统需要我们部署软件。我一直在使用一种简单的方法来检测用户是否是本地管理员,然后检测他们是否具有管理员权限。如果需要,脚本会以提升的权限重新启动。如果用户不是本地管理员,则脚本会使用不同的凭据(本地管理员)重新启动。该脚本适用于具有更高版本 PowerShell(例如 Windows 8 和 Windows 10)的系统。

问题是当用户不是管理员并且脚本在 Windows 7 上运行时。脚本使用$PSScriptPath 重新启动脚本。我认为这在早期版本的 PowerShell 中不起作用。因此,如果主要 PowerShell 版本 $PSScriptRoot。问题是脚本陷入某种循环,它只是不断打开和关闭窗口,然后我必须杀死它......如果我没有定义$PSScriptRoot 我得到错误

无法将参数绑定到参数“路径”,因为它为空

我认为这是因为 $PSScriptRoot 未在 PowerShell 2.0 中定义。

这是我正在尝试做的一个示例:

#Check if PowerShell version is greater than 2. If not, set $PSSriptRoot.
if ($PSVersionTable.PSVersion.Major -lt 3) 
    $PSScriptRoot = Split-Path -Parent $MyInvocation.MyCommand.Definition


#Check if the user is a local admin. If they are, set $LocalAdmin to $True.
$LocalAdmin = $false
if ((net localgroup administrators) -match ([System.Environment]::UserDomainName + "\\" + [System.Environment]::Username)) 
    $LocalAdmin = $true

if ($LocalAdmin) 
    #Check if the local admin needs to run the script as administrator
    if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) 
        $arguments = "& '" + $MyInvocation.MyCommand.Definition + "'"
        Start-Process powershell -Verb runas -ArgumentList $arguments
        break
    
 else 
    #Not a local admin. Relaunch script as admin user.
    Start-Process -Credential $credential (Join-Path $PSHome powershell.exe) -ArgumentList (@("-File",
        (Join-Path $PSScriptRoot $MyInvocation.MyCommand)) + $args)
    exit

【问题讨论】:

【参考方案1】:

不要重新定义automatic variables。不会有什么好事。

此外,你为什么还要这样做?您使用$PSScriptRoot 的唯一目的是重建您已有的脚本路径。只需将该路径分配给一个变量并在您的脚本中使用它。

$script = $MyInvocation.MyCommand.Definition
$ps     = Join-Path $PSHome 'powershell.exe'

$isLocalAdmin = [bool]((net localgroup administrators) -match "$env:USERDOMAIN\\$env:USERNAME")

if ($isLocalAdmin) 
    if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]'Administrator')) 
        Start-Process $ps -Verb runas -ArgumentList "& '$script'"
        exit
    
 else 
    Start-Process $ps -ArgumentList (@('-File', $script) + $args) -Credential $credential
    exit

【讨论】:

谢谢。我意识到循环窗口的错误。我非常感谢您的建议并花时间解释。干杯。

以上是关于以管理员用户身份重新启动 PowerShell 脚本的主要内容,如果未能解决你的问题,请参考以下文章

使用 PowerShell 以管理员身份运行命令?

如何使用 Powershell 'invoke-expression' 以其他用户身份运行可执行文件

Win10以管理员身份启动cmd.exe

windows 10中Microsoft Edge Beta登录账户提示:以管理员身份运行 Microsoft Edge 时不支持登录。请以非管理员身份重新启动 Microsoft Edge,然后重新

如何以管理员身份运行powershell

从以管理员身份运行的进程以用户身份启动进程