Regras em script
Nesta seção:
•Scripts do Windows PowerShell
Sobre as regras em script
As regras em script permitem que regras personalizadas sejam criadas usando-se scripts do Windows PowerShell ou em VB. O sucesso ou falha do script determina se o nível de segurança, os itens permitidos e os itens negados que fazem parte da regra serão aplicados ao usuário.
As regras em script podem aproveitar qualquer interface acessível via PowerShell ou VBScript, tal como o COM (Component Object Model).
Cada script é avaliado sob as seguintes circunstâncias:
- Quando uma nova configuração é implantada no computador;
- Quando um usuário faz logon.
Para criar ou editar scripts, acesse o Conjunto de Regras em Script desejado no Editor de Configuração do Controle de Aplicativos. Conjuntos de Regras > Em Script > [Nome do Conjunto de Regras]
Você pode definir quando o script será executado usando as seguintes opções da Regra em Script:
•Executar script:
•Por sessão como usuário - o script é executado para cada usuário que faz logon. As configurações são aplicadas somente enquanto durar a sessão do usuário.
•Por sessão como SISTEMA - o script é executado com permissões da conta SYSTEM uma única vez para cada usuário que faz logon. As configurações são aplicadas somente enquanto durar a sessão do usuário.
•Por computador como SISTEMA - o script é executado com permissões da conta SYSTEM uma única vez na inicialização do computador. As configurações são aplicadas a todas as sessões de usuário até que o computador seja reiniciado, o agente do Controle de Aplicativos seja reiniciado ou haja uma mudança de configuração.
Cuidado: a execução de scripts como usuário SYSTEM pode causar sérios danos ao seu computador e só deve ser habilitada por autores de script experientes.
•Aguardar conclusão do logon - selecione para impedir a execução do script até que o logon do usuário esteja concluído.
VBScripts
Cada script é executado em um mecanismo hospedado, o que permite maior controle sobre a execução dele e fornece alto grau de controle quanto a entradas e saídas.
- Nenhum arquivo VBS é usado.
- Nenhum processo separado é gerado.
Um script deve ser escrito como uma função e pode conter várias funções, mas é necessário especificar uma função inicial principal. A função inicial é executada pelo agente do Controle de Aplicativos e pode ser usada para chamar outras funções.
O objeto COM AMScriptRule está incorporado ao mecanismo de script e fornece acesso aos seguintes métodos:
-
strUsername = AMScriptRule.UserName
-
strUserdomain = AMScriptRule.UserDomain
-
strSessionid = AMScriptRule.SessionID
-
strStationname = AMScriptRule.WinStation
O padrão da Microsoft nessa instância significa que WinStation retorna o valor do nome da Sessão de Serviços de Terminal, que é determinado pelo tipo de sessão, com os valores típicos sendo "Console" ou "RDP-Tcp#34", em vez do nome da Estação Windows, que normalmente é WinSta0.
O objeto COM AMScriptRule também inclui os seguintes métodos:
-
strLog = AMScriptRule.Log "My Log Statement"
Permite enviar strings de log ao arquivo de log do agente para uso com regras de depuração em script.
-
strEnvironmentvar = AMScriptRule.ExpandEnvironment ("%MyEnvironmentVariables%")
Expande as variáveis de ambiente do usuário que está executando o script.
Usar o shell do WScript. para expandir variáveis de ambiente retorna somente variáveis SYSTEM.
Scripts do Windows PowerShell
Se o script retornar (sair) com valor 0, o script será aprovado, e as regras serão aplicadas. Se for retornado um valor diferente de zero, o script falhará, e as regras não serão aplicadas.
Cada script do PowerShell é executado em uma instância do PowerShell.exe e, sendo assim, o Controle de Aplicativos não impõe nem adiciona nenhuma sintaxe específica – todo PowerShell corretamente formatado vai funcionar.
O PowerShell deve estar instalado em todos os pontos de extremidade que usarão o script.
Scripts de exemplo

O VBScript a seguir demonstra como controlar os aplicativos aos quais o usuário tem acesso.
Function ScriptedRule()
’Name of Filter scan expected to pass
ExpectedFilter = "FWALL"
’Get Server Name
Set objNTinfo = CreateObject ("WinNTSystemInfo")
ServerName = lcase (objNTInfo.ComputerName)
’Set initial return value
ScriptedRule = False
’Create MetaFrame Session Object
Set MFSession = Createobject ("MetaFrameCOM.MetaFrameSession")
’Initialize the session filters for this session
For Each x in MFSession.SmartAccessFilters
’return true if our filter is found
If x = ExpectedFilter Then
ScriptedRule=True
AMScriptRule.Log "SmartAccessFilter match found."
End If
Next
End Function

O VBScript a seguir pode ser usado para determinar se um computador está em uma Unidade Organizacional de Computadores:
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
For each member in oOU
If UCase(strCompName) = UCase(member.CN) Then
ScriptedRule = vbTrue
Exit For
End If
Next
End Function

O VBScript de exemplo abaixo mostra os principais componentes de um script e demonstra como acessar as informações sobre o nome do usuário que faz logon no sistema e como fazer a correspondência com um domínio e unidade organizacional específicos:
Function MyScript()
'Get the username of the user logging in (also works when running as SYSTEM)
strUserName = AMScriptRule.UserName
'Get the domain of the user logging in (also works when running as SYSTEM)
strUserDomain = AMScriptRule.UserDomain
'Look up user environment variables (when running as SYSTEM, only SYSTEM variables are available)
strClientName = AMScriptRule.ExpandEnvironment ("%ClientName%")
'Log the output
AMScriptRule.Log strUserName & " logged in on " & strClientName
'Check if the user is a member of the domain
If strUserdomain = "MyDomain" Then
'If so, see if the user is in the MyOU OU
Set objOU = GetObject ("LDAP://ou=MyOU,dc=MyDomain,dc=com")
objOU.Filter = Array("user")
For Each objUser In objOU
'Check if there is a match with the user logging on
If objUser.sAMAccountName = strUserName Then
'if there is, then set the function to True
MyScript = True
End If
Next
End If
'Unless there is a username match, the function defaults to False
End Function

O script do Windows PowerShell abaixo mostra os principais componentes de um script e demonstra como acessar as informações sobre o nome do usuário que faz logon no sistema e como fazer a correspondência com um domínio e unidade organizacional específicos:
#Script checks if the current user is a member of the OU specified
# 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
}