Windows TS: завершить задачи пользователей с именем клиента XYZ

Я хочу запланировать задачу на Windows Terminal Server 2008 и выше, которая запускается каждые 10 минут и завершает некоторые процессы, такие как "outlook.exe", однако это следует делать только для пользователей, которые подключаются с другого TerminalServer (чтобы у них всех был один и тот же клиент Имя - пользовательская оболочка использует Outlook на своих компьютерах - Outlook должен быть установлен из-за пользователей, которые подключаются из homeoffice).

Диспетчер задач показывает имя пользователя, процессы и имя клиента.

этот маленький код отлично работает, чтобы вывести список всех зарегистрированных пользователей

strComputer = "." Установите objWMI = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\" _ & StrComputer & "\root\cimv2")

Установите colSessions = objWMI.ExecQuery _ ("Выбрать * из Win32_LogonSession, где LogonType = 10")

Если colSessions.Count = 0, то Echo "Не найдено интерактивных пользователей" Else echo "RDP Sessions:" Для каждого objSession в colSessions Установите colList = objWMI.ExecQuery("Associators of " _ & "{Win32_LogonSession.LogonId=" & objSession.LogonId & "} " _ & "Где AssocClass=Win32_LoggedOnUser Role=Dependent") Для каждого объекта в colList Echo "Имя пользователя:" & objItem.Name & "FullName: " & objItem.FullName Далее Далее Конец Если

Пользователь может получить свое собственное имя клиента, показанное здесь

Установите objShell = CreateObject( "WScript.Shell") ClientComp = objShell.ExpandEnvironmentStrings("%clientname%")

Но я не хочу, чтобы у каждого пользователя были постоянно открыты собственные VBS. Задача должна быть запланирована с правами администратора. Кажется, нет никакого способа понять это с помощью VBS и WMI, кто-нибудь из вас намекнет, пожалуйста?

3 ответа

Нет ли способа понять? Возможно с powershell или чем-то еще?

Вместо того, чтобы убивать задачу, более элегантное решение, конечно, будет препятствовать началу. Это можно сделать с помощью клавиши DisallowRun.

Вы должны создать DWORD DisallowRun со значением 1 под

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\

и подключ

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\DisallowRun\

После перезагрузки вы можете создать REG_SZ в новом подразделе с хорошим описанием и значением outlook.exe.

Теперь уловка состоит в том, чтобы установить это на основе информации о клиенте. Если вы отключите свои сессии после некоторого времени бездействия, это, вероятно, тривиально. Вам просто нужно поместить скрипт в ключ запуска пользователя или папку автозагрузки, который устанавливает или удаляет этот ключ reg.

Если возможно, что пользователь открывает свой сеанс локально, затем едет домой и продолжает тот же сеанс оттуда, вам снова понадобится запланированное задание. Вместо того, чтобы через определенное время лучше всего вызывать его на событии. Я думаю, что событие разблокировки (может потребоваться дополнительный аудит включен в соответствии с этим, так что поток) должно работать. Это вызвало бы скрипт, который проверяет имя клиента, соответственно изменяет ключ reg и закрывает outlook, если он был запущен и не должен.

Если вам нужно сделать это с администратором, я бы попробовал следующее:

Все переменные среды хранятся в реестре. Мы используем это и перебираем куст HKEY_USERS, где мы находим всех пользователей, вошедших в данный момент в систему (плюс учетная запись службы плюс пользователи, которые используются с помощью команды "выполнить от имени"). Мы идентифицируем учетные записи служб (SID начинается с чего-то, отличного от S-1-5-21) и для всех остальных мы проверяем, есть ли в ключе HKEY_USERS\\Volatile Environment подключи. Каждый из них может содержать имя клиента. Если вы поняли, что можете реагировать на эти клавиши, совмещая их с именем машины и т. Д. Я знаю по опыту, что подразделом может быть 1, 2 или оба, однако я не могу вспомнить ситуацию, когда разрешены два разных ИМЕНИ КЛИЕНТА, но я могу ошибаться, Базовой реализацией этого принципа будет следующий скрипт:

Const HKEY_USERS = &H80000003

strComputer = "."
Set objRegistry = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv") 

' Grab a list of All User SIDs
objRegistry.EnumKey HKEY_USERS, "", arrSubKeys

' Loop Through all User SIDs skip the ones that are service users and their classes hives
For Each strSubKey In arrSubKeys
    If Left(strSubKey, 8) = "S-1-5-21" And Not Right(strSubKey, 8) = "_Classes" Then
        ' The volatile environment key can have subkeys
        ret = objRegistry.EnumKey(HKEY_USERS, strSubKey & "\Volatile Environment", arrVolatileEnvironmentSubKeys)
        If ret = 0 Then
            For Each strVolatileEnvironmentSubKey In arrVolatileEnvironmentSubKeys
                objRegistry.GetStringValue HKEY_USERS, strSubKey & "\Volatile Environment", "USERNAME", strUsername
                retClientname = objRegistry.GetStringValue(HKEY_USERS, strSubKey & "\Volatile Environment\" & strVolatileEnvironmentSubKey, "CLIENTNAME", strClientname)
                If retClientname = 0 And strClientname <> "" Then
                    WScript.Echo strUsername & " is logged on remotely from " & strClientname
                Else
                    WScript.Echo strUsername & " is not logged on remotely " & strClientname
                End If              
            Next    
        End If
    End If
Next

Вместо моих отпечатков вы можете поставить любую сложную логику, которая соответствует вашим потребностям

Другие вопросы по тегам