脚本化规则
在此部分:
关于脚本化规则
脚本规则允许使用 Windows PowerShell 或 VB 脚本创建自定义规则。脚本的成功或失败决定了作为规则一部分的“安全级别”、“允许的项目”和“拒绝的项目”是否适用于用户。
脚本规则可以利用任何通过 PowerShell 或 VBScript 访问的接口,例如 COM(组件对象模型),并且每个脚本可在以下环境下接受评估:
- 将新配置部署到计算机时。
- 用户登录时。
您可以在“脚本规则”对话框中创建和编辑脚本,访问方式如下:
- 在“规则”功能区中,选择添加规则。
-
在下列菜单中,选择脚本规则。
将显示“脚本规则”工作区。
您可以使用以下脚本规则选项来定义脚本何时运行:
- 作为已登录用户每个登录会话运行一次脚本 - 对于登录的每个用户,脚本均运行一次。设置仅适用于用户会话的时间。请注意,如果桌面解锁,脚本也将运行。
- 作为系统用户每个登录会话运行一次脚本 - 对于登录的每个用户,脚本均使用系统帐户权限运行一次。设置仅适用于用户会话的时间。
-
作为系统用户按计算机运行一次脚本 - 脚本在计算机启动时使用系统帐户权限运行一次。设置适用于所有用户会话,直到计算机重新启动、Application Control 代理重新启动或配置发生更改为止。
注意:作为系统用户运行脚本可能会对计算机造成严重损坏,只能由有经验的脚本作者启用。
-
用户登录完成之前,请勿执行脚本 - 选择此选项可在用户登录完成之前阻止脚本运行。
-
在脚本超时前等待 <n> 秒 - 允许您指定脚本在超时之前可继续运行的秒数。设置为零 (0) 秒时可防止脚本超时。如果发生超时,则结果为“失败”且无法应用设置。
VBScripts
每个脚本都在托管脚本引擎中运行,允许对脚本执行进行更有效的控制,同时提供高度的输入和输出控制。
- 不使用 VBS 文件。
- 没有生成单独的进程。
脚本必须作为函数编写,并且可以包含许多函数,但是必须指定一个主启动函数。启动函数由 Application Control 代理运行,可用于调用其他函数。
AMScriptRule COM 对象内置在脚本引擎中,并提供对以下方法的访问:
strUsername = AMScriptRule.UserName
strUserdomain = AMScriptRule.UserDomain
strSessionid = AMScriptRule.SessionID
-
strStationname = AMScriptRule.WinStation
此实例中的 Microsoft standard 表示 WinStation 返回终端服务会话名称的值,其由会话的类型决定,典型值是 ’Console’ 或 ’RDP-Tcp#34’,而不是窗口站的名称(通常为 WinSta0)。
AMScriptRule COM 对象还包括以下方法:
-
strLog = AMScriptRule.Log "My Log Statement"
允许您将记录字符串输出到代理日志文件中,以用于调试脚本规则。
-
strEnvironmentvar = AMScriptRule.ExpandEnvironment ("%MyEnvironmentVariables%")
展开运行脚本的用户的环境变量。
使用 WScript.shell 展开环境变量仅返回 SYSTEM 变量。
Windows PowerShell 脚本
如果脚本以值 0 返回(退出),则脚本将通过并且应用规则。如果返回任何非零值,则脚本将失败并且不应用规则。
每个 PowerShell 脚本都在 PowerShell.exe 的实例中执行,因此 Application Control 既不强制执行也不添加任何特定语法,所有格式正确的 PowerShell 都将正常工作。
PowerShell 必须安装在任何将使用脚本的端点上。
添加脚本化规则
-
选择“规则”功能区上的添加规则下拉箭头,然后选择脚本规则。
在“所有脚本规则”工作区中添加一条新规则。将显示脚本化规则对话框。
- 要输入脚本,请执行以下操作之一:
- 在当前脚本区域中键入脚本。
- 在脚本编辑器中打开现有脚本,复制/剪切内容并粘贴。
- 选择单击此处编辑脚本。单击导入以导入现有脚本。
编辑脚本规则
- 使用“脚本规则”对话框创建和维护基于自定义 VB 和 PowerShell 脚本的规则,这些脚本在用户登录时运行。
- 要打开特定规则的“脚本规则”对话框,您可以:
- 导航至导航窗格中的“脚本规则”并选择它。
在导航树中选择规则节点。在“所有规则”对话框中,双击要编辑的规则。
将显示“脚本化规则”对话框。
-
单击单击此处编辑脚本。
将显示“配置此脚本规则”对话框。
- 在“脚本”选项卡中,添加或修改用户登录时使用的脚本。
- 在“选项”选项卡中,从“定义执行设置”部分中的可用选项列表中选择“脚本执行设置”。
- 要指定脚本时间设置,请在“定义脚本时间设置”部分中选择相应选项。
- 单击确定。
示例脚本
以下 VBscript 演示了如何控制用户可以访问的应用程序。
Function ScriptedRule()
’应通过的筛选扫描名称
ExpectedFilter = "FWALL"
’获取服务器名称
Set objNTinfo = CreateObject ("WinNTSystemInfo")
ServerName = lcase (objNTInfo.ComputerName)
’设置初始返回值
ScriptedRule = False
’创建 MetaFrame 会话对象
Set MFSession = Createobject ("MetaFrameCOM.MetaFrameSession")
’启动此会话的会话筛选器
对于 MFSession.SmartAccessFilters 中的每个 x
’如果找到我们的筛选器,返回 true
If x = ExpectedFilter Then
ScriptedRule=True
AMScriptRule.Log "SmartAccessFilter match found."
End If
下一步
结束功能
以下 VBscript 可用于确定计算机是否在计算机组织单位中:
Function ScriptedRule()
ScriptedRule = vbFalse
strCompName = AMScriptRule.StationName
Set oRootDSE = GetObject("LDAP://RootDSE")
strDNSDomain = oRootDSE.Get("DefaultNamingContext")
Set oOU = GetObject("LDAP://OU=TheOUyouAreSearching,OU=Parent,OU=Parent," & strDNSDomain)
oOU.GetInfo
对于 oOU 中的每个成员
If UCase(strCompName) = UCase(member.CN) Then
ScriptedRule = vbTrue
退出
End If
下一步
结束功能
以下示例 VBScript 显示了脚本的主要组件,并演示了如何访问登录到系统的用户的用户名信息,以及如何与特定域和组织单位匹配:
Function MyScript()
'获取登录用户的用户名(以 SYSTEM 身份运行时同样有效)
strUserName = AMScriptRule.UserName
'获取用户登录的域(以 SYSTEM 身份运行时同样有效)
strUserDomain = AMScriptRule.UserDomain
'查找用户环境变量(当以 SYSTEM 身份运行时,仅 SYSTEM 变量可用)
strClientName = AMScriptRule.ExpandEnvironment ("%ClientName%")
'记录输出
AMScriptRule.Log strUserName & " logged in on " & strClientName
'检查用户是否为域的成员
If strUserdomain = "MyDomain" Then
'如果是,检查用户是否在 MyOU OU 中
Set objOU = GetObject ("LDAP://ou=MyOU,dc=MyDomain,dc=com")
objOU.Filter = Array("user")
对于 objOU 中的每个 objUser
'检查是否与登录的用户匹配
If objUser.sAMAccountName = strUserName Then
'如果匹配,则将函数设置为 True
MyScript = True
End If
下一步
End If
'除非用户名匹配,否则函数默认为 False
结束功能
以下示例 Windows PowerShell 脚本显示了脚本的主要组件,并演示了如何访问登录到系统的用户的用户名信息,以及如何与特定域和组织单位匹配:
#Script 检查当前用户是否为指定 OU 的成员
# Return 0 if TRUE
# 1 otherwise
$logonuser = $env:username
$bindpt = [adsi] "LDAP://OU=TS_Users,OU=Users,OU=MyUser,OU=MyOU,DC=MyDomain,DC=com"
$users = New-Object System.DirectoryServices.DirectorySearcher $bindpt
$users.Filter = "(&(objectClass=User)(sAMAccountName=$logonuser))"
$obj = $users.FindOne()
if($obj -eq $null)
{
#" Not a Member"
exit 1
}