在PowerShell脚本中,如何检查我是否以管理员权限运行?


Answers:


34
$currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())
$currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

(来自命令行安全提示


2
$ currentPrincipal =新对象Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity] :: GetCurrent())&{if($ currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole] :: Administrator)){(get-主机).UI.RawUI.Backgroundcolor =“暗红色”明确的主机写主机“警告:PowerShell是运行作为Administrator.`n”}
戴维

第一行:最后一个大括号)丢失。我无法解决此问题,因为它少于6个字符。
Xavier Nicollet

57

在PowerShell中4.0你可以使用需要在你的脚本的顶部:

#Requires -RunAsAdministrator

输出:

无法运行脚本“ MyScript.ps1”,因为它包含一个“ #requires”语句以管理员身份运行。当前的Windows PowerShell会话未以管理员身份运行。使用“以管理员身份运行”选项启动Windows PowerShell,然后尝试再次运行脚本。


并不是我一直在寻找的东西,但仍然非常有用。谢谢埃迪!
Michael Kelley 2015年

33
function Test-Administrator  
{  
    $user = [Security.Principal.WindowsIdentity]::GetCurrent();
    (New-Object Security.Principal.WindowsPrincipal $user).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)  
}

执行以上功能。如果结果为True,则该用户具有管理员权限。


4
这仅确定运行脚本的用户是否是计算机上的管理员,而不确定当前是否以管理权限执行脚本。换句话说,即使用户未使用“以管理员身份运行”来启动命令外壳程序,这仍将返回true。
整体开发人员

2
@HolisticDeveloper,那是不正确的。如果您没有被提升,它将返回false
charleswj81'1

截至目前,@ charleswj81我观察到Holistic Developer所描述的行为。
zneak

我认为您不需要半冒号...但是那也不表示会引发错误
Kolob Canyon

从2018年开始,这在Win10上对我有效。如果当前用户帐户未提升,则返回False;如果powershell运行系统提升,则返回True。
Arberg

0

这将检查您是否是管理员,如果不是,则它将以管理员身份在PowerShell ISE中重新打开。

希望这可以帮助!

    $ver = $host | select version
    if ($ver.Version.Major -gt 1)  {$Host.Runspace.ThreadOptions = "ReuseThread"}

    # Verify that user running script is an administrator
    $IsAdmin=[Security.Principal.WindowsIdentity]::GetCurrent()
    If ((New-Object Security.Principal.WindowsPrincipal $IsAdmin).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator) -eq $FALSE)
    {
      "`nERROR: You are NOT a local administrator.  Run this script after logging on with a local administrator account."
        # We are not running "as Administrator" - so relaunch as administrator

        # Create a new process object that starts PowerShell
        $newProcess = new-object System.Diagnostics.ProcessStartInfo "PowerShell_ise";

        # Specify the current script path and name as a parameter
        $newProcess.Arguments = $myInvocation.MyCommand.Definition;

        # Indicate that the process should be elevated
        $newProcess.Verb = "runas";

        # Start the new process
        [System.Diagnostics.Process]::Start($newProcess);

        # Exit from the current, unelevated, process
        exit
    }

0

作为上述答案的组合,您可以在脚本开头使用类似以下的内容:

# todo: put this in a dedicated file for reuse and dot-source the file
function Test-Administrator  
{  
    [OutputType([bool])]
    param()
    process {
        [Security.Principal.WindowsPrincipal]$user = [Security.Principal.WindowsIdentity]::GetCurrent();
        return $user.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator);
    }
}

if(-not (Test-Administrator))
{
    # TODO: define proper exit codes for the given errors 
    Write-Error "This script must be executed as Administrator.";
    exit 1;
}

$ErrorActionPreference = "Stop";

# do something

另一种方法是用此行启动脚本,这将在不以管理员权限启动时阻止其执行。

#Requires -RunAsAdministrator

1
不幸的是,这不起作用。如果脚本不是以提升的权限运行的,则它甚至都不会加载,并且您也不会看到自定义错误消息。
JamesQMurphy

谢谢。我已经改正了上面的答案。
MovGP0
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.