【问题标题】:Windows TS: Terminate tasks of users with client name XYZWindows TS:终止具有客户端名称 XYZ 的用户的任务
【发布时间】:2015-01-30 10:03:47
【问题描述】:

我想在 Windows Terminal Server 2008 及更高版本上安排一个任务,该任务每 10 分钟运行一次,并终止一些进程,如“outlook.exe”,但是这仅适用于从另一个 TerminalServer 连接的用户(所以他们都有相同的客户端名称 - 用户 shell 在他们自己的计算机上使用 Outlook - 由于用户从家庭办公室连接,因此必须安装 Outlook。

任务管理器显示用户名、进程和客户端名称。

这个小代码可以很好地列出所有登录的用户

strComputer = "."设置 objWMI = GetObject("winmgmts:" _ &“{impersonationLevel=impersonate}!\”_ & strComputer & "\root\cimv2")

设置 colSessions = objWMI.ExecQuery _ ("Select * from Win32_LogonSession Where LogonType = 10")

If colSessions.Count = 0 Then Echo "No interactive users found" Else echo "RDP Sessions:" For Each objSession in colSessions Set colList = objWMI.ExecQuery("Associators of " _ & "{Win32_LogonSession.LogonId=" & objSession.LogonId & "} " _ &“其中 AssocClass=Win32_LoggedOnUser 角色=依赖”) 对于 colList 中的每个 objItem Echo "用户名:" & objItem.Name & " 全名:" & objItem.FullName 下一个下一个结束如果

用户可以获得他自己的客户名称,如下所示

设置 objShell = CreateObject( "WScript.Shell" ) ClientComp = objShell.ExpandEnvironmentStrings("%clientname%")

但我不希望每个用户都有自己的 vbs 永久打开。应使用管理员权限安排任务。似乎没有办法使用 vbs 和 WMI 来实现这一点,请各位大神指点一下?

【问题讨论】:

  • 是否有特定原因必须与管理员用户一起安排任务?对于您描述的行为,您也可以使用用户权限运行它,然后每个用户都会杀死自己的前景。此外,如果您有 gpos,您可以通过拒绝特定用户开始运行 exe 而不是一直授予他们 10 分钟的时间来阻止整个事情。我希望很多人会再次重新打开前景
  • 我的意图是只需要运行一个脚本。可以使用系统特权运行。基于用户是不可能的,因为一些用户同时使用 - homeoffice 和从其他 TS 连接。应该允许 Homeoffice 使用 Outlook,而其他人则不能。如果他们再次打开 Outlook 超过时间限制,例如 3 分钟,那么他们注意到在 TS 上使用 Outlook 是没有意义的......
  • 是的,我的意思是使用用户权限运行它,但仍然检查客户端名称,但是你是对的,多个脚本会同时运行,尽管我认为它不会花费很多性能.不幸的是,我通过 wmi 查询发现了我的想法,并且 applocker gpo 也不起作用,因为 win32_environment 似乎不包含客户端名称,因为它是易变的。所以你可能需要某种登录脚本

标签: windows vbscript process scheduled-tasks terminal-server


【解决方案1】:

有没有办法实现?也许使用 powershell 或其他东西?

【讨论】:

  • 正如我试图告诉你的那样,使用管理员用户很难做到这一点,我强烈建议不要这样做(因为客户端名称特定于每个用户)。此外,关闭的想法不如阻止打开。如果您坚持以管理员身份运行它,我可以尝试在明天给您一个可能的解决方案的提示。作为旁注,您不应发布其他问题作为答案,而应编辑您的问题或使用本网站上的 cmets...
  • 嗨,感谢您的帮助。阻止打开 wpould 也是我的最爱,但是如果同一个用户从另一台机器(家用 PC)登录时应该被允许打开这些程序,该怎么办
  • 我发布了我的管理员运行脚本的解决方案,但我也将发布一个概念作为第二个答案,该概念可以 imo 用于可靠地防止取决于您对用户行为的评价程度
【解决方案2】:

如果您需要由管理员执行此操作,我会尝试以下操作:

环境变量都存储在注册表中。 我们使用它并遍历 HKEY_USERS 配置单元,在其中我们找到所有当前登录的用户(加上服务帐户以及与“运行方式”命令一起使用的用户) 我们识别服务帐户(SID 以 S-1-5-21 以外的其他内容开头),对于所有其他帐户,我们检查键 HKEY_USERS\\Volatile Environment 是否具有子键。它们中的每一个都可能包含一个 CLIENTNAME。如果你知道了,你可以对那些用机器名等对它们进行数学运算的键做出反应。我从经验中知道子键可以是 1、2 或两者,但是我想不出允许两个不同 CLIENTNAME 的情况,但我可能是错的.该原则的基本实现将是以下脚本:

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

您可以放置​​任何适合您需求的复杂逻辑,而不是我的印刷品

【讨论】:

    【解决方案3】:

    与其终止任务,更优雅的解决方案当然是阻止启动。这可以通过 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 密钥。

    如果用户有可能在本地打开他的会话,然后开车回家并从那里继续相同的会话,您将需要再次执行计划任务。最好的事情是在某个事件上触发它,而不是在某个时间之后。我认为解锁事件(可能需要根据this so thread 启用额外的审核)应该可以工作。它会触发一个脚本来检查客户端名称,相应地更改 reg 键并在 Outlook 正在运行且不应该运行时关闭它。

    【讨论】:

    • 谢谢,听起来很有趣。我们不会因超时而终止会话,用户可以“开车回家”并使用他们的会话。我会试试你的建议。
    • 如果你有任何运气,请让我更新。我有一个最终的想法,它只是一个肮脏的黑客,我什至不会发布它,但如果没有其他方法,你可以告诉我你是否想尝试一下
    猜你喜欢
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    相关资源
    最近更新 更多