我正在编写一个批处理脚本,在该脚本中,我需要检查特定进程是否已以管理员权限运行,并且我找不到合适的命令来执行此操作。 Tasklist命令没有提供该信息。 是否可以通过命令(可能没有第三方软件)获取有关给定进程(不是cmd.exe,而是任何进程)特权的信息?
编辑: 我不需要确定哪个帐户启动了该进程,也不需要检查cmd.exe进程是否正在以管理员权限运行。我需要检查给定进程是否正在以管理员权限运行,因为稍后我想调用需要与给定进程具有相同特权的程序。
答案 0 :(得分:0)
Admin。将这两个(2)文件放在同一目录中。运行Confirm-Admin.bat
将在输出中返回True
,如果该进程以admin身份运行,则返回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
答案 1 :(得分:0)
好的,因此,经过一些研究和实验,我设法部分解决了我的问题。
首先,我检查批处理脚本是否以管理员权限运行:
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
)
因此,在有或没有管理员权限的情况下,有四种可能的情况运行脚本和进程。
运行tasklist
命令将找不到具有提升权限的给定进程,并将退出代码设置为1。因此,您可以100%确定该进程正在以提升的特权运行,但仅当批处理时脚本在没有管理员权限的情况下运行。
运行tasklist
命令将找到给定的进程。基于1)的结果,您可以100%确定该进程在没有提升特权的情况下运行,但是仅当批处理脚本在没有管理员特权的情况下运行。
这些都是有问题的方案。当脚本以提升的特权运行时,将找到给定的进程,但是运行tasklist
时具有和没有提升权限的进程之间没有区别。
特权检查后,我需要以与给定进程相同的权限运行程序。权限上的差异将导致错误,并且给定的权限将仅在没有管理员权限的情况下运行,因此仅在没有管理员权限的情况下运行批处理脚本将无法解决问题。