【问题标题】:Batch - check if given process is running with admin privileges批处理 - 检查给定进程是否以管理员权限运行
【发布时间】:2019-07-06 11:45:51
【问题描述】:

我正在编写一个批处理脚本,我需要在其中检查特定进程是否以管理员权限运行,但我找不到合适的命令来执行此操作。 Tasklist 命令没有给我这些信息。 有没有办法通过命令(可能没有第三方软件)获取给定进程(不是 cmd.exe,而是任何进程)的权限信息?

编辑: 我不需要确定哪个帐户启动了该进程,也不需要检查 cmd.exe 进程是否以管理员权限运行。我需要检查给定进程是否以管理员权限运行,因为稍后我想调用需要与给定进程具有相同权限的程序。

【问题讨论】:

  • 我知道在没有第三方实用程序的情况下确定此信息的唯一方法是通过 GUI,而不是命令行。在 GUI 中,您可以通过添加提升和/或 UAC 虚拟化列来使用任务管理器 Windows 8+。
  • 你可以用C或其他语言编写一个小程序,从TOKEN_ELEVATION structure读取TokenIsElevated

标签: windows batch-file cmd


【解决方案1】:

通过从 .bat 文件脚本调用 PowerShell 脚本很容易确认管理员。将这两 (2) 个文件放在同一目录中。运行Confirm-Admin.bat 将在输出中返回True,如果进程以管理员身份运行,则1 作为ERRORLEVEL。如果不是以管理员身份运行,它将返回 False 作为输出并返回零 (0) 作为 ERRORLEVEL。

=== Confirm-Admin.ps1

function ExitWithCode($exitcode) {
    $host.SetShouldExit($exitcode)
    exit $exitcode
}

$currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())
if ($currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
    Write-Output "True"
    ExitWithCode 1
} else {
    Write-Output "False"
    ExitWithCode 0
}

=== Confirm-Admin.bat

powershell -NoLogo -NoProfile -File "%~dp0%~n0.ps1"

要在 PowerShell 中运行 Confirm-Admin.ps1,请调用另一个 Powershell 来运行它。

C:>powershell -NoLogo -NoProfile -File "Confirm-Admin.ps1"
True
PS 10:59  C:\src\t
C:>$LASTEXITCODE
1

如果你只想留在 cmd.exe 世界,请看https://stackoverflow.com/a/11995662/447901

【讨论】:

  • 感谢您的回答,但这不是我要找的。我需要检查任何给定进程的管理员权限,而不是 cmd.exe 或当前用户。
【解决方案2】:

好的,经过一些研究和实验,我已经设法部分解决了我的问题。

首先,我检查批处理脚本是否以管理员权限运行:

fsutil dirty query %SYSTEMDRIVE% >nul
if %errorLevel% == 0 (
    set isBatchElevated=true
) else (
    set isBatchElevated=false
)

然后,我通过获取当前用户运行的所有任务的列表并按名称查找进程来查找特定进程:

tasklist /fi "username eq %USERDOMAIN%\%USERNAME%" | find /i "processname" > nul
if errorlevel 1 (
    :: batch script doesn't have admin privileges, but the process has
)

因此,有或没有管理员权限运行脚本和进程有四种可能的情况。

1) 没有管理员权限的批处理脚本,有管理员权限的进程

运行tasklist 命令将找不到具有提升权限的给定进程,并将退出代码设置为 1。因此,您可以 100% 确定该进程正在以提升的权限运行,但前提是批处理脚本在没有管理员权限的情况下运行。

2) 没有管理员权限的批处理脚本,没有管理员权限的进程

运行tasklist 命令将找到给定的进程。根据 1) 结果,您可以 100% 确定该进程在没有提升权限的情况下运行,但前提是批处理脚本在没有管理员权限的情况下运行。

3)/4) 具有管理员权限的批处理脚本,具有/不具有管理员权限的进程

这些都是有问题的场景。当脚本以提升的权限运行时,将找到给定的进程,但在运行tasklist 时,有和没有提升权限的进程没有区别。

权限检查后,我需要运行与给定进程具有相同权限的程序。权限的差异会导致错误,并且仅在没有管理员权限的情况下将无法运行给定的脚本,因此仅在没有管理员权限的情况下运行批处理脚本不会解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-08
    • 2011-05-12
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 2015-03-25
    • 1970-01-01
    相关资源
    最近更新 更多