Пакетно - проверьте, запущен ли данный процесс с правами администратора - PullRequest
0 голосов
/ 06 июля 2019

Я пишу пакетный скрипт, в котором мне нужно проверить, запущен ли определенный процесс с правами администратора, и у меня возникают проблемы с поиском подходящей команды для этого. Команда Tasklist не дает мне эту информацию. Есть ли способ получить информацию о привилегиях данного процесса (не cmd.exe, а какой-либо процесс) с помощью команды (и, возможно, без стороннего программного обеспечения)?

Edit: Мне не нужно определять, какая учетная запись запустила процесс, а также не нужно проверять, запущен ли процесс cmd.exe с правами администратора. Мне нужно проверить, работает ли данный процесс с правами администратора или нет, потому что позже я хочу вызвать программу, которая должна иметь те же привилегии, что и данный процесс.

Ответы [ 2 ]

0 голосов
/ 10 июля 2019

Хорошо, после некоторых исследований и экспериментов мне удалось частично решить мою проблему.

Во-первых, я проверяю, запущен ли пакетный скрипт с правами администратора:

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.

различий между процессами с повышенными правами и без них не будет.

После проверки привилегий мне нужно запустить программу с теми же правами, что и у данного процесса. Разница в привилегиях приведет к ошибке, и данные не будут работать без прав администратора, поэтому запуск пакетного скрипта без прав администратора не решит проблему.

0 голосов
/ 06 июля 2019

Админ легко подтверждается вызовом скрипта PowerShell из скрипта файла .bat.Поместите эти два (2) файла в один и тот же каталог.Запуск Confirm-Admin.bat вернет True в выводе и 1 в качестве ОШИБКИ, если процесс запущен от имени администратора.Если он не запущен от имени администратора, он вернет False в качестве выхода и ноль (0) в качестве ОШИБКИ.

=== 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"

Чтобы запустить Confirm-Admin.ps1 в PowerShell, вызовите другой 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...