迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 >

以管理员身份运行 PowerShell 脚本

作者:迹忆客 最近更新:2024/03/01 浏览次数:

我们编写和执行的大多数脚本都需要权限,导致管理员从提升的 PowerShell 提示符运行脚本。在 PowerShell 中,我们通过以管理员权限运行 Windows PowerShell 并输入我们的管理员凭据来提升我们的权限。

但是,我们可能需要在不输入管理员凭据的情况下针对特定情况无缝运行我们的脚本。因此,我们可以在脚本开头集成各种自提升命令,我们将在本文中向你展示如何操作。


使用 Start-Process Cmdlet 以管理员身份运行 PowerShell 脚本

Start-Process cmdlet 启动一个或多个进程、可执行文件或脚本文件,或已安装软件可以在本地计算机上打开的任何文件,包括 Windows PowerShell。

使用此 cmdlet 和一组参数,我们可以以管理员身份运行 Windows PowerShell。

对于这个例子,我们创建了一个 Hello_World.ps1 脚本,它将在我们的控制台中输出一个简单的 Hello World 字符串。

Hello_World.ps1

Write-Output 'Hello World!'

我们可以使用上面的 PowerShell 文件作为示例来检查和验证我们是否以管理员权限运行我们的脚本。首先,运行下面的代码片段。

Start-Process powershell -verb RunAs -ArgumentList ".\Hello_World.ps1"

运行上述脚本后,它将生成一个具有管理权限的新 Windows PowerShell 实例。上面运行的脚本的唯一警告是,如果我们需要将参数传递给 PowerShell 文件,我们不会将参数传递到新生成的管理控制台。


以管理员身份运行带参数的 PowerShell 脚本

此示例可以采用我们之前的单行脚本并在多个条件语句中对其进行修改。

# Self-elevate the script if required
if (-Not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator')) {
    if ([int](Get-CimInstance -Class Win32_OperatingSystem | Select-Object -ExpandProperty BuildNumber) -ge 6000) {
        $Command = "-File `"" + $MyInvocation.MyCommand.Path + "`" " + $MyInvocation.UnboundArguments
        Start-Process -FilePath PowerShell.exe -Verb RunAs -ArgumentList $Command
        Exit
 }
}

# Place your script here
Write-Output 'Hello World!'

以前,我们通过调用一个单独的文件来运行我们的 PowerShell 脚本,但我们可以简单地将我们的脚本(例如,Hello_World.ps1)放在这个示例的这个片段下方。

以下是代码段的工作原理。

  • 第一个 if 语句检查执行的脚本是否已经在具有管理权限的 Windows PowerShell 中运行。
  • 第二个 if 语句检查 Windows 操作系统内部版本号是否为 6000 或更高。 (Windows Vista 或 Windows Server 2008 或更高版本)
  • $Command 变量检索并保存用于运行脚本的命令,包括参数。
  • Start-Process 使用提升的权限启动一个新的 Windows PowerShell 实例,并像我们之前的脚本一样重新运行该脚本。

以管理员身份运行 PowerShell 脚本,同时保留工作目录

我们可能需要为特定情况保留脚本的工作目录。因此,这是一个将维护工作目录的自升式代码段:

if (-Not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
    if ([int](Get-CimInstance -Class Win32_OperatingSystem | Select-Object -ExpandProperty BuildNumber) -ge 6000) {
        Start-Process PowerShell -Verb RunAs -ArgumentList "-NoProfile -ExecutionPolicy Bypass -Command `"cd '$pwd'; & '$PSCommandPath';`"";
        Exit;
    }
}
# Place your script here
Write-Output 'Hello World!'

在此代码段中,我们将 $PSCommandPath 作为 Start-Process cmdlet 中的参数之一传递,以保留脚本执行的工作目录。

保留工作目录对于执行路径相关操作至关重要。不幸的是,我们之前展示的前几个片段不会保持它们的路径,这可能会导致意外错误。因此,你可以使用上面修改后的语法。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 Windows PowerShell 中终止脚本

发布时间:2024/02/29 浏览次数:121 分类:编程语言

本文将列举几种在 Windows PowerShell 中终止脚本的方法。本文将解释和定义所有几个命令,并引用示例脚本块来说明在何处使用它们。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便