В некотором роде небольшого смягчения для большой сети для эксплойта замены utilman.exe при ремонте Windows с помощью cmd.exe, а затем изменения пароля пользователя, я делаю небольшой скрипт на основе инструмента EventSentry, который обнаружит, что utilman.exe изменен и Я могу прикрепить к нему действие. Но это обнаружение произойдет после того, как злоумышленник уже вошел в систему на локальном компьютере. Итак, я делаю сценарий, который изменяет права доступа и блокирует удаление и переименование utilman.exe, и я хочу добавить изменение пароля для текущего зарегистрированного пользователя, а затем выйти из системы.
Это то, что у меня так far:
@ECHO off
takeown /f c:\windows\system32\utilman.exe
icacls c:\windows\system32\utilman.exe /deny *S-1-1-0:(DE,WD,AD,RX)
net user [NeedToGetLogedUser] 123456
shutdown -L
Прилагаемое мной действие выполнит этот скрипт под другим пользователем (не под фактическим зарегистрированным пользователем). Поэтому мне нужно, чтобы на компьютере был зарегистрирован фактический текущий пользователь, а не пользователь, под которым будет запускаться этот сценарий.
Я думал о:
C:\Users\MyUser>query user
USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME
>MyUser console 1 Active none 7/9/2020 6:27 PM
Но я не могу понять, как проанализировать результат, чтобы получить Только "MyUser" (с помощью findstr), чтобы использовать его с командой net user.
for / F "tokens = 2 delims =="% f in ('wmic computersystem получить имя пользователя / значение ^ | find "="') установить "ConsoleUser =% f"
Вывод:
"\> set" ConsoleUser = COMPUTERORDOMAINNAME \ username
При запуске в пакетном файле замените% на %%
для / F "tokens = 2 delims ==" %% f in ( 'wmic computersystem получить имя пользователя / значение ^ | find "="') установить "ConsoleUser = %% f"
echo% ConsoleUser%
Спасибо за все ответы. Это помогло мне найти решение. В итоге я сделал этот сценарий, который идеально подходит для того, что мне нужно :)
@ECHO off
set ConsoleUser=None
takeown /f c:\windows\system32\utilman.exe
icacls c:\windows\system32\utilman.exe /deny *S-1-1-0:(DE,WD,AD,RX)
for /F "tokens=1" %%f in ('query user ^| find ">"') do set "ConsoleUser=%%f"
net user %ConsoleUser:~1% 123456
shutdown -L
Этот сценарий ограничит выполнение, удаление и переименование utilman.exe, сбросит пароль пользователя, который вошел в систему, а затем выйдет из системы. . Таким образом, злоумышленник не может снова изменить utilman.exe или запустить его, а пароль пользователя был изменен.
Еще раз спасибо!
Если вы хотите разделить имя пользователя и домен, а затем использовать его для установки пути к данным локального приложения для пользователя, вот как это сделать
:: Get current session user's Domain and username
for /F "tokens=2 delims==" %%f in ('wmic computersystem get username /value ^| find "="') do set "ConsoleUser=%%f"
:: Split and set variables for current session user's Domain and username
FOR /f "tokens=1 delims=\" %%a IN ("%ConsoleUser%") do set "domain=%%a"
FOR /f "tokens=2 delims=\" %%b IN ("%ConsoleUser%") do set "user=%%b"
:: Echo username and domain
echo %domain%
echo %user%
:: Set variable localappdata path and echo
set localappdata "C:\users\%user%\AppData\Local"
echo %localappdata%
То же, что и ниже, с использованием Powershell
# get the Session ID of this process - the same as that of the user
$sessionId = Get-Process -id $pid | select-object -expand SessionId
# get the output of 'query.exe user' for that session ID
$quOutput = query.exe user $sessionId
# parse the output of query.exe to get the user ID only
$userId = $quOutput[1] -replace '^>([^\s]+)+.*$','$1'
# set localappdata path
$localappdata = "C:\users\${userid}\appdata\local"
..и для хет-трика -то же, что и выше, используя vbscript
Set wshShell = WScript.CreateObject("WScript.Shell")
' Get the username
strUsername = Get_LoggedOnUserName()
' Set localappdata variable and then echo it out
Dim localappdata
localappdata = "C:\users\" & strUsername & "\appdata\local"
wscript.echo localappdata
Function Get_LoggedOnUserName
Dim Array
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_ComputerSystem",,48)
For Each objItem in colItems
Array = Split(objItem.UserName, "\", -1, 1)
Get_LoggedOnUserName = Array(1)
Next
End Function