以管理员身份运行 PowerShell 脚本
我们编写和执行的大多数脚本都需要权限,导致管理员从提升的 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 中的参数之一传递,以保留脚本执行的工作目录。
保留工作目录对于执行路径相关操作至关重要。不幸的是,我们之前展示的前几个片段不会保持它们的路径,这可能会导致意外错误。因此,你可以使用上面修改后的语法。
相关文章
在 Windows PowerShell 中获取命令行参数
发布时间:2024/03/04 浏览次数:358 分类:编程语言
-
本文将解释我们如何使用 PowerShell 的参数函数处理命令行参数,参数如何工作,我们如何使用 PowerShell 参数将值传递给参数,以及定义参数的基本方法是什么。
Windows PowerShell 中的 Base64 编码
发布时间:2024/03/04 浏览次数:332 分类:编程语言
-
本文将展示如何编码和解码 base64 字符串。Windows PowerShell 当前版本没有本机命令,因此我们将向你展示如何执行此操作的替代方法。
在 Windows PowerShell 中写入输出
发布时间:2024/03/04 浏览次数:259 分类:编程语言
-
本文将向你展示如何在 Windows PowerShell 中编写或打印输出。本文还将区分多个 write cmdlet 并解释它们的意义。
在 Windows PowerShell 中设置 PATH 环境变量
发布时间:2024/03/04 浏览次数:350 分类:编程语言
-
本文将展示在 Windows PowerShell 中设置路径环境变量的正确方法。本文还展示了如何在持久性和非持久性方法中设置变量。
在 Windows PowerShell 中打印环境变量
发布时间:2024/03/04 浏览次数:869 分类:编程语言
-
本文将讨论什么是环境变量以及如何使用多个 Windows PowerShell 命令打印它们。
在 PowerShell 中注释代码
发布时间:2024/03/04 浏览次数:363 分类:编程语言
-
本文将展示在 Windows PowerShell 中注释代码的多种方法。本文还介绍了注释代码时的一些最佳实践。
在 PowerShell 中执行 LDAP 查询
发布时间:2024/03/04 浏览次数:304 分类:编程语言
-
本文将深入了解如何使用 Active Directory 过滤器和 LDAP 过滤器。