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

时间:2016-10-12 12:40:57

标签: powershell powershell-v2.0

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

问题是当用户不是管理员且脚本在Windows 7上运行时。脚本使用$PSScriptPath重新启动脚本。我不认为这适用于早期版本的PowerShell。因此,如果主要的PowerShell版本是<我尝试自己设置$PSScriptRoot 3.问题是剧本陷入某种循环,只是不断打开和关闭窗口然后我必须杀死它...如果我不定义$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 个答案:

答案 0 :(得分: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
}