Règles scriptées
Dans cette section :
- À propos des règles scriptées
- VBScripts
- Scripts Windows PowerShell
- Ajout d'une règle scriptée
- Modification d'une règle scriptée
- Exemples de scripts
À propos des règles scriptées
Les règles scriptées permettent de créer des règles personnalisées à l'aide de scripts Windows PowerShell ou VBScript. Le succès ou l'échec du script détermine si le niveau de sécurité, les éléments autorisés et les éléments refusés figurant dans la règle s'appliquent ou non à l'utilisateur.
Les règles scriptées peuvent exploiter toutes les interfaces accessibles via PowerShell ou VBScript, par exemple COM (Component Object Model), et chaque script est évalué dans les circonstances suivantes :
- Déploiement d'une nouvelle configuration sur l'ordinateur.
- Connexion d'un utilisateur.
Vous créez et modifier les scripts dans la boîte de dialogue Règle scriptée, accessible comme suit :
- Dans le ruban Règles, sélectionnez Ajouter une règle.
-
Dans le menu déroulant, sélectionnez Règle scriptée.
La zone de travail Règle scriptée apparaît.
Vous pouvez définir le moment où le script doit être exécuté, à l'aide des options de règle scriptée suivantes :
- Exécuter le script une fois par session de connexion en tant qu'utilisateur connecté - Le script s'exécute pour chaque utilisateur qui se connecte. Les paramètres s'appliquent uniquement pour la durée de la session utilisateur. Notez que le script s'exécute également si le poste de travail est déverrouillé.
- Exécuter le script une fois par session de connexion en tant qu'utilisateur SYSTEM - Le script s'exécute avec les permissions du compte SYSTEM une seule fois pour chaque utilisateur qui se connecte. Les paramètres s'appliquent uniquement pour la durée de la session utilisateur.
-
Exécuter le script une fois par ordinateur en tant qu'utilisateur SYSTEM - Le script est exécuté avec les permissions du compte SYSTEM une seule fois au démarrage de l'ordinateur. Les paramètres sont appliqués à toutes les sessions utilisateur jusqu'au redémarrage de l'ordinateur, jusqu'au redémarrage de l'agent Application Control (Contrôle des applications) ou jusqu'à un changement de configuration.
Attention : L'exécution de scripts en tant qu'utilisateur Système (SYSTEM) peut provoquer de sérieux dommages sur votre ordinateur et l'opération doit être réservée aux auteurs de script expérimentés.
-
Ne pas exécuter le script avant la fin de la connexion utilisateur - Sélectionnez cette option pour interdire l'exécution du script jusqu'à ce que la connexion utilisateur soit établie.
-
Attendre <n> secondes avant temporisation du script - Permet de spécifier la durée (en secondes) pendant laquelle un script est autorisé à continuer son exécution avant que le délai qui lui est imparti soit écoulé. En indiquant zéro (0) seconde, vous ne fixez aucune limite pour le script. Si le délai s'écoule, le résultat est un échec et les paramètres ne peuvent pas être appliqués.
VBScripts
Chaque script est exécuté dans un moteur de script hébergé, ce qui permet un meilleur contrôle de l'exécution des scripts, tout en assurant un haut niveau de contrôle des entrées/sorties (E/S).
- Aucun fichier VBS n'est utilisé.
- Aucun processus distinct n'est généré dynamiquement.
Le script doit être écrit sous forme de fonction et peut contenir de nombreuses fonctions, mais vous devez spécifier une fonction principale de démarrage. La fonction de démarrage est exécutée par l'agent Application Control (Contrôle des applications) et peut servir à appeler d'autres fonctions.
L'objet COM AMScriptRule est intégré au moteur de scripts et permet d'accéder aux méthodes suivantes :
strUsername = AMScriptRule.UserName
strUserdomain = AMScriptRule.UserDomain
strSessionid = AMScriptRule.SessionID
-
strStationname = AMScriptRule.WinStation
Dans ce cas, la norme Microsoft veut que WinStation renvoie la valeur de nom de la session de services de terminal, qui dépend du type de la session. Les valeurs habituelles sont « Console » ou « RDP-Tcp#34 », au lieu du nom de la station de travail Windows (généralement WinSta0).
L'objet COM AMScriptRule inclut aussi les méthodes suivantes :
-
strLog = AMScriptRule.Log "My Log Statement"
Permet de créer une sortie des chaînes de journalisation dans le fichier journal de l'agent, à utiliser avec les règles scriptées de débogage.
-
strEnvironmentvar = AMScriptRule.ExpandEnvironment ("%MyEnvironmentVariables%")
Développe les variables d'environnement de l'utilisateur qui exécute le script.
L'utilisation de WScript.shell pour développer les variables d'environnement renvoie uniquement les variables système (SYSTEM).
Scripts Windows PowerShell
Si le script se ferme avec la valeur 0, l'opération est un succès et les règles sont appliquées. Si le système renvoie une valeur non nulle, le script échoue et les règles ne s'appliquent pas.
Chaque script PowerShell est exécuté dans une instance de PowerShell.exe et, par conséquent, Application Control (Contrôle des applications) n'applique ni n'ajoute aucune syntaxe spécifique. Toutes les instructions PowerShell au format correct fonctionnent.
PowerShell doit être installé sur tous les postes client qui vont utiliser le script.
Ajout d'une règle scriptée
-
Cliquez sur la liste déroulante Ajouter une règle dans le ruban Règles et sélectionnez Règle scriptée.
Une nouvelle règle est ajoutée à la zone de travail Toutes les règles scriptées. La boîte de dialogue Règle scriptée s'ouvre.
- Pour saisir un script, effectuez l'une des opérations suivantes :
- Entrez le script dans la zone Script actuel.
- Ouvrez un script existant dans un éditeur de script, puis copiez/coupez le contenu et collez-le.
- Sélectionnez Cliquez ici pour modifier le script. Cliquez sur Importer pour importer un script existant.
Modification d'une règle scriptée
- Utilisez la boîte de dialogue Règle scriptée pour créer des règles et assurer leur maintenance sur la base de scripts VB et PowerShell personnalisés exécutés chaque fois qu'un utilisateur se connecte.
- Pour ouvrir la boîte de dialogue Règle scriptée d'une règle spécifique, utilisez l'une des méthodes suivantes :
- Naviguez jusqu'à la règle scriptée dans le volet de navigation et sélectionnez-la.
Sélectionnez le nœud Règles dans l'arborescence de navigation.Dans la boîte de dialogue Toutes les règles, double-cliquez sur la règle à modifier.
La boîte de dialogue Règle scriptée s'ouvre
-
Sélectionnez Cliquez ici pour modifier le script.
La boîte de dialogue Configurer cette règle scriptée s'ouvre.
- Dans l'onglet Script, complétez ou modifiez le script à utiliser lorsque vos utilisateurs se connectent.
- Dans l'onglet Options, sélectionnez le paramétrage d'exécution du script dans la liste des options disponibles de la section Définir les paramètres d'exécution du script.
- Pour spécifier les paramètres de délai du script, sélectionnez les options voulues dans la section Définir les paramètres horaires du script.
- Cliquez sur OK.
Exemples de scripts

Le script VBscript suivant montre comment contrôler les applications auxquelles un utilisateur a accès.
Function ScriptedRule()
'Nom de l'analyse Filtre qui doit être transmise
ExpectedFilter = "FWALL"
'Obtention du nom de serveur
Set objNTinfo = CreateObject ("WinNTSystemInfo")
ServerName = lcase (objNTInfo.ComputerName)
'Définition de la valeur de retour initiale
ScriptedRule = False
'Création de l'objet de session MetaFrame
Set MFSession = Createobject ("MetaFrameCOM.MetaFrameSession")
'Initialisation des filtres de session pour cette session
Pour chaque x dans MFSession.SmartAccessFilters
'Renvoie true (vrai) si le filtre est trouvé
If x = ExpectedFilter Then
ScriptedRule=True
AMScriptRule.Log "Correspondance SmartAccessFilter trouvée."
End If
Next
Fin de la fonction

Vous pouvez utiliser le script VBscript suivant pour déterminer si un ordinateur se trouve dans une unité organisationnelle Ordinateur :
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
Pour chaque membre dans oOU
If UCase(strCompName) = UCase(member.CN) Then
ScriptedRule = vbTrue
Exit For
End If
Next
Fin de la fonction

L'exemple de script VBScript suivant montre les principaux composants d'un script et explique comment accéder aux informations concernant le nom de l'utilisateur qui se connecte au système, puis les mettre en correspondance avec un domaine et une unité organisationnelle spécifiques :
Function MyScript()
'Obtention du nom de l'utilisateur qui se connecte (fonctionne aussi pour l'exécution en tant que SYSTEM)
strUserName = AMScriptRule.UserName
'Obtention du nom de domaine qui se connecte (fonctionne aussi pour l'exécution en tant que SYSTEM)
strUserDomain = AMScriptRule.UserDomain
'Recherche des variables d'environnement (lors de l'exécution en tant que SYSTEM, seules les variables SYSTEM sont disponibles)
strClientName = AMScriptRule.ExpandEnvironment ("%ClientName%")
'Journalisation de la sortie
AMScriptRule.Log strUserName & " connecté à " & strClientName
'Vérifier si l'utilisateur est membre du domaine
If strUserdomain = "MyDomain" Then
'Si oui, vérifier si l'utilisateur figure dans l'OU MyOU
Set objOU = GetObject ("LDAP://ou=MyOU,dc=MyDomain,dc=com")
objOU.Filter = Array("user")
Pour chaque objet objUser dans objOU
'Vérifier s'il existe une correspondance avec l'utilisateur qui se connecte
If objUser.sAMAccountName = strUserName Then
'Si oui, définir la fonction sur True (vrai)
MyScript = True
End If
Next
End If
'Sauf en cas de correspondance du nom d'utilisateur, la valeur par défaut de la fonction est False (faux)
Fin de la fonction

L'exemple de script Windows PowerShell suivant montre les principaux composants d'un script et explique comment accéder aux informations concernant le nom de l'utilisateur qui se connecte au système, puis les mettre en correspondance avec un domaine et une unité organisationnelle spécifiques :
#Le script vérifie si l'utilisateur actuel est membre de l'OU spécifiée
# 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
}