Удалить задание и завершить процесс по тайм-ауту

I think the cmdlet aspect is fine. But for processes, I’m struggling. In the below example if I take away the -wait from running notepad, it returns a process ID (which i could then kill) but of course the job finishes instantly.

If I put the -wait in, when it times out it returns nothing because the start-process command hasn’t finished. So I can’t kill the launched process (notepad.exe).

Any pointers would be helpful – thanks.

asked Dec 20, 2023 at 15:00

1 gold badge14 silver badges32 bronze badges

Finally, note that UWP applications (typically obtained from Microsoft Store) are often launched in a manner where the original process delegates to a different, non-child process and then exits right away, which makes them impossible to track based on the original process’ ID.

answered Dec 20, 2023 at 17:28

67 gold badges672 silver badges861 bronze badges

Background

Inactivity timeouts aren’t just about security, they’re also about resource management. IT professionals and Managed Service Providers (MSPs) often implement these features to save power, reduce wear on hardware, and as an initial layer of security. The script provided dives deep into the realm of automating this process, allowing for a set-it-and-forget-it approach.

The Script

Access 300+ scripts in the NinjaOne Dojo

Detailed Breakdown

This PowerShell script aims to set the inactivity timeout on Windows. Here’s how it works:

Functions

Imagine working in a university’s public computer lab. Multiple students use these computers throughout the day. To ensure each student’s work remains confidential, the IT department could utilize this script. By setting an inactivity timeout of, say, 5 minutes, they ensure that if a student forgets to log out, the system automatically locks, preventing unauthorized access.

Comparisons

While there are GUI methods to set inactivity timeouts, such as through the Windows Control Panel, this script provides an advantage in scalability. For massive deployments across numerous computers, using a script like this is more efficient. Additionally, other methods might involve Group Policy settings, but they lack the granularity and quick application that a PowerShell script can offer.

:/>  Команда для синхронизации времени с сервером

FAQs

While the immediate purpose is to enhance security, the wrong inactivity timeout can disrupt work, especially if set too short. On the flip side, too long a timeout might compromise security. Moreover, inactivity settings become critical in high-security environments, where leaving a terminal unlocked could have grave consequences.

Recommendations

NinjaOne offers a comprehensive IT monitoring and management solution, and when integrated with scripts like this, it provides robust control over an IT environment. Whether you’re looking to set inactivity timeouts or manage other aspects of IT infrastructure, NinjaOne remains a reliable partner for efficient, secure, and optimized operations.

Для оповещения пользователей о различных событиях, вы можете выводить различные графические уведомления из скриптов PowerShell. В PowerShell можно использовать всплывающие уведомления в трее Windows или модальные окно для получения информации от пользователя или подтверждения действия.

Вывести всплывающее сообщение на экран с помощью PowerShell

Для вывода простых модального диалогового окна в Windows можно воспользоваться Wscript классами подсистемы сценариев Windows. Следующий PowerShell код выведет обычное текстовое окно с вашим текстом и кнопкой OK.

$wshell = New-Object -ComObject Wscript.Shell$Output = $wshell.Popup(“Скрипт формирования отчета выполнен”)

Удалить задание и завершить процесс по тайм-ауту

Вы можете настроить вид модального окна такого сообщения и добавить кнопки действия для пользователей. Например, чтобы вывести всплывающее окно с кнопками Да и Нет, выполните:

$Output = $wshell.Popup(“Скрипт формирования отчета завершен! Хотите вывести его на экран?”,0,”Отчет готов”,4+32)

Если пользователь нажмет Да, команда вернет значение
6
, а если Нет –
7
.

В зависимости от выбора пользователя вы можете выполнить какое-то действие, или завершить скрипт.

Общий синтаксис и параметры метода Popup:

Команда PowerShell возвращает целое значение, с помощью которого можно узнать, какая кнопка была нажата пользователем. Возможные значения:

:/>  Пропали папки, файлы и значки с рабочего стола. Что делать?

Если нужно показать пользователю окно ввода и запросить данные, воспользуйтесь классом Windows Forms.

Чтобы обработать введенные пользователе данные:

Удалить задание и завершить процесс по тайм-ауту

Если нужно вывести всплывающее окно поверх всех окон, используйте команду:

Вывести уведомление пользователю Windows из скрипта PowerShell

С помощью класса Windows Forms можно вывести более красивые всплывающие сообщения (ballons). Следующий скрипт выведет всплывающее сообщение рядом с панелью уведомлений Windows, которое автоматически исчезнет через 10 секунд:

Для создания красочных всплывающих сообщений в Windows можно использовать отдельный PowerShell модуль BurntToast.

Установите модуля из PowerShell Gallery:

Install-Module -Name BurntToast

Теперь, например, в ранее рассматриваемый скрипт автоматического отключения от Wi-FI сети при подключении к Ethernet можно добавить уведомление с картинкой:

New-BurntToastNotification -Text “Отключение от Wi-Fi сети”, “Вы были отключены от Wi-Fi сети, т.к. Вше устройство было подключено к скоростному Ethernet подключению.” -AppLogo C:PSchangenetwork.png

Отправка сообщения пользователю на удаленный компьютер

С помощью PowerShell вы можете отправить всплывающее сообщение пользователю на удаленный компьютер. Сначала нужно получить список сессии пользователей на удаленном компьютере (в случае RDS сервера):

Чтобы отправить сообщение в сессию пользователя на удаленном компьютер, выполните команду:

MSG kbuldogov /server:rds1 “Сервер будет перезагружен через 10 минут. Закройте документы”

Если всплывающее сообщение нужно отправить всем пользователям укажите * вместо имени пользователя:

MSG * /server:rds1 “Срочное сообщение всем! “

Для отправки всплывающего графического уведомления на удаленный компьютер можно воспользоваться скриптом RemoteSendToasNotification.ps1 из нашего GitHub репозитория ( https://github.com/winadm/posh/blob/master/scripts/RemoteSendToasNotification.ps1). Для подключения к удаленному компьютеру используется командлет Invoke-Command, который использует WinRM.

Удалить задание и завершить процесс по тайм-ауту

Да, это очень мощный скриптовый язык, но:

1) Есть ли IDE, которая показывает/подсказывает свойства и методы у данного объекта или класса? А то задолбался руками это делать.

2) Даже после 5 лет работы с PowerShell так и не привык к его “левому” синтаксису.

:/>  В какой режим можно управлять устройствами?

3) Просмотрев десятки, если не сотни, предложений по работе за последние 2 месяца, помню буквально одно, где был упомянут PowerShell. Увы.

Ну а вообще, почти весь Ansible на Виндах реализован через PowerShell.

Всего голосов 6: ↑6 и ↓0

Всего голосов 1: ↑1 и ↓0

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

Всего голосов 3: ↑3 и ↓0

Левый, значит очень многословный и нетрадиционный.

Кстати, а пинговать и делать что-то с десятками и сотнями машин лучше через Ansible, мне кажется.

Всего голосов 2: ↑1 и ↓1

Всего голосов 6: ↑4 и ↓2

Видимо, изучение самого .NET, который даёт PowerShell-у огромные возможности, останавливало многих админов. Сколько знаю Windows-админов, изучивший Python, никто из них не углублялся в PowerShell + .NET. А зря, как очевидно.

PowerShell хорош тем, что в нем есть мощные админные/девопсные модули, которые на Python замучаешься писать.

Всего голосов 4: ↑4 и ↓0

Всего голосов 2: ↑2 и ↓0

Кроме командлетов, .NET и COM в PowerShell есть ещё и возможность импорта произвольных DLL-библиотек.

Что только люди не сделают, что бы C# не учить 🙂 Та же пинговалка, 2000 хостов пингует 10 секунд, всё из-за того, что пытается сделать 10 пингов с таймаутом по 1 сек. Если все ответят, то будет чуть дольше, чем самый долгий хост отвечал.