0

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

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

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

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

Set 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 & "} " _ & "Where AssocClass=Win32_LoggedOnUser Role=Dependent" ) For Each objItem in colList Echo "Username: " & objItem.Name & " FullName: " & objItem.FullName Next Next End If

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

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

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

4

3 回答 3

0

与其终止任务,更优雅的解决方案当然是阻止启动。这可以通过 DisallowRun 键来完成。

您将在下面创建一个值为 1 的 DWORD DisallowRun

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

和一个子键

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

重新启动后,您现在可以在具有良好描述和值“outlook.exe”的新子项下创建 REG_SZ。

现在诀窍当然是根据客户端名称信息进行设置。如果您在一段时间不活动后断开会话,这可能是微不足道的。您只需要在用户运行密钥或启动文件夹中放置一个脚本来设置或删除此 reg 密钥。

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

于 2015-02-05T08:42:41.357 回答
0

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

于 2015-02-04T10:44:21.213 回答
0

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

环境变量都存储在注册表中。我们使用它并遍历 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

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

于 2015-02-05T08:10:57.610 回答