Узнаем кто удалил или установил программу в Windows
Добрый день! Уважаемые читатели и гости одного из крупнейших IT блогов в рунете Pyatilistnik.org. В прошлый раз я вас научил определять кто именно перезагрузил сервер, это полезный навык при расследовании инцидентов. Бывают ситуации, что на сервер используют большое количество пользователей с одинаковыми правами, и вдруг куда-то пропадает одна из программ, вы видите что ее нет, логично, что нужно выяснить кто именно удалил программу. Вот этим мы и займемся, я вас научу получать информацию, кто установил или удалил программу в Windows.
Как узнать кто установил программу и когда
И так у меня есть тестовый сервер с операционной системой Windows Server 2019 и я на него в качестве демонстрации буду устанавливать Microdoft Edge Chromium, FireFox Mozilla, а так же LogParser. Все события, что генерируются в операционной системе Windows появляются в просмотре событий, это лог файлы разбитые по журналам.
Открываем логи Windows, журнал "Приложение (Application)" или "Система (System)", все зависит от инсталлятора которым собран пакет, так как есть те, что используют метод MsiInstaller , но есть и другие. Теперь запускаем инсталлятор LogParser. После установки я открываю журнал "Приложение", где я вижу ряд событий,
первое это событие с ID 1040 покажет вам начало установки программы:
Далее идет сообщение с кодом ID 10000.
Далее вы увидите событие, где заканчивается установка программы ID 1042
Завершается сеанс событием с кодом ID 10001
И заканчивается установка программы событием с кодом ID 11707
Иногда вы можете увидеть событие с ID 1033.
Если вы внимательны, то можете обратить внимание, что источником событий тут выступает MsiInstaller. Зная это вы легко можете произвести фильтрацию. Для этого в правой части найдите пункт "Фильтр текущего журнала"
В источниках событий выберите из выпадающего списка пункт MsiInstaller.
В итоге у меня получилось вот так.
Теперь когда события отфильтрованы по источнику MsiInstaller, вам будет еще легче найти кто установил, что установил и когда. В моем примере это сделал ROOT\Администратор.
Так же событие ID 11707 с пользователем "SYSTEM (СИСТЕМА)" вы можете обнаружить, когда люди используют "Software Store" в SCCM
Если вы любите веб интерфейс, то должны уже использовать Windows Admin Center, в котором вы легко можете с любого устройства подключиться к просмотру событий нужного сервера и посмотреть необходимые события.
Автоматизация оповещения по событиям 11707
Теперь когда вы знаете, как находить события по установке программ в системах семейства Windows, вам нужно автоматизировать данный процесс. Например, получать по почте, кто установил, где и что. В этом нам поможет конечно же PowerSell. Смысл автоматизации состоит в том, что вы на нужном сервере создаете задание в планировщике Windows, где будет запускаться скрипт PowerShell. Я вам приведу два скрипта, первый тот, что гуляет на просторах интернета.
Тут главное заполнить:
- Адрес вашего SMTP сервера
- От кого будет письмо
- Кому отправлять письмо
- Пароль от ящика отправителя
$Server = "smtp.pyatilistnik.org" # Тут пишем ваш SMTP Server
$From = “install@pyatilistnik.org” # От кого будет отослано письмо
$To = "ivan@pyatilistnik.org" # Кому отправляется письмо
$Pwd = ConvertTo-SecureString "123456" -AsPlainText -Force #Пароль учетной записи отправителя
# (Внимание! Используйте очень ограниченную учетную запись для отправителя, поскольку пароль, сохраненный в скрипте, не будет зашифрован)
$Cred = New-Object System.Management.Automation.PSCredential("From@domain.com" , $Pwd) #Sender account credentials
$encoding = [System.Text.Encoding]::UTF8 #Установка кодировки в UTF8 для корректного отображения сообщения
#Команда Powershell для фильтрации журнала безопасности об установленном программном событии
$Body=Get-WinEvent -FilterHashtable @{LogName="Application";ID=11707;ProviderName='MsiInstaller'} | Select TimeCreated, Message, UserID | select-object -first 1
#Отправка электронной почты.
Send-MailMessage -From $From -To $To -SmtpServer $Server -Body “$Body” -Subject $Subject -Credential $Cred -Encoding $encoding
В результате вы получите письмо вот такого содержания:
Тут два недостатка, во первых вы не видите, где был установлен новый софт, понятно, что можно на каждом сервере, где выполняется скрипт писать свою тему, но это не так удобно. Во вторых у вас в место имени пользователя идет SID, который потом нужно конвертировать в понятное имя.
Так же вам никто не запрещает просто открыть PowerShell и ввести не сложный код:
Напоминаю, что select-object -first 1 выводит первое событие, можете увеличить на нужное вам.
Как найти события установки программ не методом MsiInstaller
Как я и писал выше не все инсталляторы программ используют метод MsiInstaller, например при установке Edge Chrome или Mozilla Firefox, вы в журнале "Приложение" не обнаружите события с кодом ID 11707. В таком случае вам нужно перейти в журнал "СИСТЕМА (SYSTEM)" и сразу отфильтровать события по номеру ID 7045.
Выглядит событие ID 7045 вот так:
Имя службы: Mozilla Maintenance Service
Имя файла службы: "C:\Program Files (x86)\Mozilla Maintenance Service\maintenanceservice.exe"
Тип службы: служба режима пользователя
Тип запуска службы: Вручную
Учетная запись службы: LocalSystem
Имя службы: Microsoft Edge Elevation Service
Имя файла службы: "C:\Program Files (x86)\Microsoft\Edge\Application\80.0.361.111\elevation_service.exe"
Тип службы: служба режима пользователя
Тип запуска службы: Вручную
Учетная запись службы: LocalSystem
Имя файла службы: "C:\Program Files (x86)\Microsoft\EdgeUpdate\MicrosoftEdgeUpdate.exe" /medsvc
Тип службы: служба режима пользователя
Тип запуска службы: Вручную
Учетная запись службы: LocalSystem
Как узнать кто удалил программу с сервера или компьютера
По аналогии с установкой, процесс деинсталляции или как его еще называют удаление, генерирует свои события в журналах Windows. Если мы говорим, про источник MsiInstaller из журнала "Приложение (Application)", то нам нужно фильтровать события по ID 11724 и ID 1034.
Так же вы можете спокойно использовать описанный выше скрипт и команду PowerShell, для автоматизации оповещения, о удалении программы.
Дополнительно
Хочу отметить, что существует ряд платных программ которые специализируются на аудите событий в Windows системах, например netwrix и им подобные, где вы так же легко сможете получать всю информацию, о том кто и когда установил программу, или кто и когда ее удалил.
- https://social.technet.microsoft.com/wiki/contents/articles/32412.powershell-how-to-detect-who-installed-what-software-on-your-windows-server-in-real-time.aspx
- https://www.netwrix.com/how_to_detect_software_installations.html
На этом у меня все, мы с вами подробно все рассмотрели по данной задаче. Если у вас остались вопросы, то пишите их в комментариях, а с вами был Иван Семин, автор и создатель IT портала Pyatilistnik.org.
Send-MailMessage : Не удается проверить аргумент для параметра «Body». Аргумент пустой или имеет значение NULL. Укажите непустой аргумент, не имеющий значение NULL, после чего повторите выполнение команды.
строка:1 знак:64
+ … Message -From $From -To $To -SmtpServer $Server -Body «$Body» -Subjec …
+ ~~~~~~~
+ CategoryInfo : InvalidData: (:) [Send-MailMessage], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.SendMailMessage
У меня система сама запускает в фоновом режиме Adobe Reader, Фотографии и Office.
Хотя в автозагрузке их нет и файлы я тоже не открываю. Что-то здесь нечисто.