Script VBS pour créer une ressource sur un cluster

Vous voulez lancer un script dans un cluster Windows MSCS, il faut respecter un prototype minimum pour que le service cluster puisse l’appeler et vérifier qu’il est actif et vivant.

Voilà les fonctions minimales:

Open()
Online()
Offline( )
Close()
Terminate( )
LooksAlive( )
IsAlive( )

Dans la suite c’est copier coller de différentes sources, que j’ai mis là pour les regrouper et les retrouver facilement.

 

A control script consists of a set of entry point functions (for example, IsAlive) for the Generic Script resource DLL. The Resource Monitor calls these scripted entry point functions during cluster operation. Except for the Open function, the scripted entry point functions serve the same purpose as the same-named resource DLL entry point functions implemented using the Failover Cluster API. For more information, see Implementing Resource DLLs.

A control script must implement the LooksAlive and IsAlive functions and can also implement the functions Open, Online, Offline, Close, and Terminate.

Note  You should not store control script files on cluster disks. Although these drives may seem to be the ideal location because all nodes in the cluster can access them, storing control script files there causes problems when you upgrade either the Cluster service or the application software, especially if the cluster is in a production environment. Such upgrades require the cluster to be shut down completely. If you choose instead to install control script files on all nodes in the cluster, you can use a rolling upgrade approach—upgrading each node individually—without affecting the operation of the cluster.

Script Execution

A Resource Monitor call to either of the time-critical entry point functions LooksAlive or IsAlive executes directly, without calling other entry point functions and without loading or unloading the script. A Resource Monitor call to any other entry point function (for example, Online) generates associated Resource Monitor entry point function calls (for example, to Open) and may cause the script to load or unload. For more information on the Resource Monitor actions for each entry point function call, see the following table.

In a control script, code within the script body, outside any of the entry point functions, is executed when the script is loaded. Code within an entry point function is executed whenever that function is called. For example, code within the Open function is executed not only when the script is opened, but also when Open is called prior to Online or Close

 

The Resource object is an object automatically created by the Generic Script resource DLL for each instance of a scripted resource. Your script can use the methods and properties of the Resource object to identify the resource, log information about the resource, and manipulate private properties.

Function name
Resource monitor actions

Open
Perform when the script is opened. Resource Monitor will:

  • load the script
  • call Open
  • call Close
  • unload the script

Online
Perform when the resource is placed online. Resource Monitor will:

LooksAlive
Perform one or more very fast, cursory checks of the specified instance with the emphasis on detecting potential problems rather than verifying operational status. IsAlive will determine whether the instance is really operational. Take no more than 300 milliseconds to return a value. Resource Monitor calls LooksAliverepeatedly at a specified time interval (for example, once every five seconds).

IsAlive
Perform a complete check of the resource to see if it is functioning properly. The set of procedures you need to use depends on your resource. For example, a database resource should check to see that the database can write to the disk and perform queries and updates to the disk. If the resource has definitely failed, return FALSE. The Resource Monitor immediately sets the status of the resource to “ClusterResourceFailed” and calls the Terminate entry point function. Resource Monitor calls IsAliverepeatedly at a specified time interval (for example, once every sixty seconds).

Offline
Perform when the resource is placed offline. Resource Monitor will:

Close
Perform when the script is closed. Resource Monitor will:

  • load the script
  • call Open
  • call Close
  • unload the script

Terminate
Perform when terminating the script. Resource Monitor will:

  • load the script (if not already loaded)
  • call Open
  • call Terminate
  • call Close
  • unload the script
Parameters and Return Values

Parameters are not passed in a call to an entry point function in a script.

An entry point function can optionally set a return value. A return value of zero (or “true”) indicates success and does not appear in the cluster log. The functions LooksAlive and IsAliveshould return the Boolean “true” rather than a numeric zero. Success is assumed if the return value is not set explicitly in the function.

A non-zero return value (or false) indicates failure and appears in the cluster log.

Accessing Resources

The Generic Script resource DLL creates a Resource object for each scripted resource instance. The Resource object enables a control script to log information, manipulate properties, and access the resource name. For more information, see Resource Object.

Note  To avoid deadlocks, do not use the Cluster Automation Server, the Failover Cluster WMI Provider, or otherwise make any calls to the Cluster API from your control script. All interaction with the cluster should be done through the Resource object.

Instance Management

For each instance of a scripted resource, the Generic Script resource DLL runs an instance of a control script in a separate thread. Thus there is no need to implement instance management in a control script; as far as a control script is concerned, there is one and only one resource instance.

Control Script Layout

The following example illustrates the layout of a control script in VBScript that implements all the supported entry point functions. For executable script resource examples, see Scripted Resource Example.

'   ... Insert your script-level global variables and definitions here
'   ... e.g. Resource.LogInformation("ScriptWide Global Stuff is Run")
'   ... Code placed here is outside any entry point function.
'   ... It is run once when the script is created
'   ... and once when the script is placed online.

Function Open( )
'   ... Insert your Open code here.
End Function

Function Online( )
'   ... Insert your Online code here.
'   ... Online is executed once when the resource is placed online.
End Function

Function LooksAlive( )
'   ... Insert your LooksAlive code here.
'   ... LooksALive is executed at specified intervals.
End Function

Function IsAlive( )
'   ... Insert your IsAlive code here.
'   ... IsAlive is executed at specified intervals
'   ... or when a LooksAlive call fails.
End Function

Function Offline( )
'   ... Insert your Offline code here.
'   ... Offline is executed once when the resource is placed offline.
End Function

Function Close( )
'   ... Insert your Close code here.
End Function

Function Terminate( )
'   ... Insert your Terminate code here.
'   ... Terminate is executed once when the script terminates.
End Function

Voici un exemple de script tout fait, à mettre comme une ressource

Function Offline( )
Resource.LogInformation "Entering Script Offline"
Offline = 0
End Function

Function Close()
Close = 0
End Function

Function Terminate( )
Terminate = 0
End Function

Function LooksAlive( )
Resource.LogInformation "Entering Script LooksAlive"
LooksAlive = true
End Function

Function IsAlive( )
Resource.LogInformation "Entering Script IsAlive"
IsAlive = true
End Function

Function Open( )
Open = 0
End Function

Function Online( )
Resource.LogInformation "Entering Script Online"
On Error Resume Next

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set nodeInfo = objWMIService.ExecQuery("Select Name from Win32_ComputerSystem")

For Each objNode in nodeInfo

If objNode.Name = "MACHINENOEUD1" Then
Resource.LogInformation "Custom Script will run here. "

' PLACE CUSTOM SCRIPT HERE

Else
Resource.LogInformation "Custom Script will not run here. "
End If

Next

Online = 0
End Function

Function Offline( )
Resource.LogInformation "Entering Script Offline"
Offline = 0
End Function

Function Close()
Close = 0
End Function

Function Terminate( )
Terminate = 0
End Function

Function LooksAlive( )
Resource.LogInformation "Entering Script LooksAlive"
LooksAlive = true
End Function

Function IsAlive( )
Resource.LogInformation "Entering Script IsAlive"
IsAlive = true
End Function

Exemple numéro 2 un peu plus complexe

'Script-Level Global Variables
Resource.LogInformation("Script-wide code begins execution")
Dim WshShell, oExec, oLooksAlive, oIsAlive, oWait
Set WshShell = CreateObject("WScript.Shell")
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")

Function Online( )
'   ... Create a network share...
Resource.LogInformation "Entering Online"
'   ... Prompt console operator for a sharename if none provided...
If Resource.Sharename = "" Then
Resource.LogInformation "You need to set the sharename private property before attempting to go online"
'   ... No-zero return code will appear in console log...
Online = 1
Exit Function
End If
'   ... Prompt console operator for a sharepath if none provided...
If Resource.SharePath = "" Then
Resource.LogInformation "You need to set the SharePath private property before attempting to go online"
Online = 1
Exit Function
End If

Set oExec = WshShell.Exec("net share """ & Resource.ShareName & """=""" & Resource.SharePath & """")
'   ... Allow time for operation to complete...
Do While oExec.Status = 0
Set oWait = WshShell.Exec("sleep 1")
Loop
If oExec.ExitCode <> 0 Then
Resource.LogInformation "net share """ & Resource.ShareName & """=""" & Resource.SharePath & """ command failed"
Resource.LogInformation oExec.StdErr.ReadAll
End If
Online = oExec.ExitCode
End Function

Function Offline( )
Resource.LogInformation "Entering Offline"
Set oExec = WshShell.Exec("net share """ & Resource.ShareName & """ /delete")
Do While oExec.Status = 0
Set oWait = WshShell.Exec("sleep 1")
Loop
If oExec.ExitCode <> 0 Then
Resource.LogInformation "Failed to disconnect the resource to an offline status gracefully"
Resource.LogInformation oExec.StdErr.ReadAll
End If
Offline = oExec.ExitCode
End Function

Function LooksAlive( )
Resource.LogInformation "Entering LooksAlive"
Set oLooksAlive = WshShell.Exec("net share """ & Resource.ShareName & """")
Do While oLooksAlive.Status = 0
Set oWait = WshShell.Exec("sleep 1")
Loop
If oLooksAlive.ExitCode <> 0 Then
Resource.LogInformation "net share """ & Resource.ShareName & """ command is failing with"
Resource.LogInformation oLooksAlive.StdErr.ReadAll
End If
LooksAlive = oLooksAlive.ExitCode
End Function

Function IsAlive( )
Resource.LogInformation "Entering IsAlive"
Set oIsAlive = WshShell.Exec("net share """ & Resource.ShareName & """")
Do While oIsAlive.Status = 0
Set oWait = WshShell.Exec("sleep 1")
Loop
If oIsAlive.ExitCode <> 0 Then
Resource.LogInformation "net share """ & Resource.ShareName & """ command is failing with"
Resource.LogInformation oIsAlive.StdErr.ReadAll
End If
If (fso.FolderExists(Resource.SharePath) = False) Then
Resource.LogInformation "folder " & Resource.SharePath & " no longer exists"
IsAlive = 1
Exit Function
End If
IsAlive = oIsAlive.ExitCode
End Function

Function Open( )
If Resource.PropertyExists("ShareName") = False Then
Resource.AddProperty("ShareName")
End If
If Resource.PropertyExists("SharePath") = False Then
Resource.AddProperty("SharePath")
End If
Open = 0
End Function

Function Close( )
Close = 0
End Function

Function Terminate( )
Resource.LogInformation "Entering Terminate"
Set oExec = WshShell.Exec("net share """ & Resource.ShareName & """ /delete")
Do While oExec.Status = 0
Set oWait = WshShell.Exec("sleep 1")
Loop
If oExec.ExitCode <> 0 Then
Resource.LogInformation oExec.StdErr.ReadAll
End If
Terminate = oExec.ExitCode

End Function

Exemple 3 affichage de la timezone

Function Online( )
'
'   Application VBScript uses WMI to reveal the node's local time zone description
'
On Error Resume Next
'
'   For the local computer only...
'
strComputer = "."
'
'   ... query the property...
'
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_TimeZone",,48)
'
'   ... and output the local time zone to the log
'
For Each objItem in colItems
Resource.LogInformation "Local Time Zone is: " & objItem.Description
Next
'   ... Return success
Online =  true
End Function
Function LooksAlive( )
LooksAlive = true
End Function
Function IsAlive( )
IsAlive = true
End Function

Alléger et optimiser les GPO sur Windows 2008

Les GPO


L’une des nouveautés du côté d’Active Directory dans Windows Server 2008 et ultérieur, c’est l’optimisation des GPOs à travers le Group Policy Template ou GPT.

Optimisation des GPOs


Le GPT est la composante physique de l’objet stratégie de groupe que l’on retrouve dans le volume SYSVOL.

Nous pouvons l’afficher dans le répertoire \\FQDN\sysvol\FQDN\Policies

Chaque dossier portant comme nom un GUID correspondant à la composante physique des GPOs affichés dans votre console GPMC

Repertoire GPO

Les modèles d’administration ont pour but d’ajouter de nouveaux paramètres configurables aux GPOs, ceux-ci peuvent aussi bien configurer le système d’exploitation que des applications Microsoft ou d’autres programmes tiers. Ces configurations s’effectuent par de simples changements de valeurs de clés de registre dans la base d’un client Windows.

Sous Active Directory dans Windows Server 2008 ces modèles d’administration prennent un nouvel essor à travers le format ADMX, un nouveau format dont l’édition s’en retrouve plus simple (XML).

Afin d’utiliser au mieux ces ADMX, un magasin central est nécessaire. Dans ce référentiel nous déposerons tous les fichiers ADMX afin d’avoir un répertoire centralisé qui concentre tous les fichiers ADMX nécessaires pour les GPOs.

Pour commencer, il va falloir récupérer des fichiers ADMX.

Vous pouvez les récupérer sur le Microsoft Download Center pour Windows Server 2008 R2 et Windows 7.

Téléchargez et installez le MSI dans le répertoire de votre choix

clip_image002[1]

Celui-ci va créer un dossier « PolicyDefinitions », dans ce dossier seront stockés vos ADMX ainsi que les fichiers de régionalisation de la console Editeur de stratégie de groupe (ADML). Ces fichiers ADML ne servent uniquement à traduire l’éditeur de stratégie de groupe dans la langue du système sur lequel on lance gpme.msc, un même fichier ADMX peut bien sûr configurer un Windows 7 qu’il soit FR,EN,ou ES. Les nouveaux OS ayant d’abord un langage neutre sur lequel se greffent les packs de langues.

clip_image003[1]

Vous pouvez ensuite incorporer d’autres sources ADMX de votre choix afin de pouvoir configurer certains paramètres directement depuis vos GPOs.

Prenons l’exemple d’Office 2010. Microsoft fourni sur le MDC les modèles d’administration nécessaires.

L’exécutable nous invite à choisir un dossier pour l’extraction. Il nous donne les ADMX mais également les modèles d’administration classiques ADM ainsi que l’Office Customization Tool.

clip_image004[1]

Nous allons récupérer le contenu du répertoire « ADMX » afin de l’ajouter dans le dossier PolicyDefinitions précédemment crée par le MSI

clip_image005[1]

Au passage nous ajouterons une dernière gamme de fichiers ADMX, ceux d’un programme tiers, Google Chrome.
La popularité des navigateurs tiers qui monte en flèche, les besoins de certaines populations d’utilisateurs sont autant de raisons qui justifient la gestion des navigateurs autre que notre cher Internet Explorer. Pourtant nous ne sommes démunis d’outils.
En effet nous retrouvons sur le site Chromium Projects des admx. Même chose, à partir du fichier ZIP fourni il faut naviguer dans le dossier correspondant \Windows\ADMX et extraire le contenu directement dans le dossier PolicyDefinitions

clip_image006[1]

Ce dossier PolicyDefinitions contenant les fichiers ADMX ADML de Windows 7,Server 2008 R2, Office 2010 ainsi que Google Chrome pèse 190Mo.
La création de notre Magasin Central va se faire par le déplacement de notre dossier tout juste préparé vers le partage SYSVOL. Plus exactement dans le répertoire \\FQDN\sysvol\FQDN\Policies

clip_image008Si le dossier ne porte pas le nom exact « PolicyDefinitions » votre Central Store ne sera pas opérationnel

Désormais les modèles d’administration affichés dans la console GPME proviennent du magasin central

clip_image009[1]

A quoi sert ce Magasin Central ?

Si je crée 10 GPOs qui configurent un seul élément tel des pages d’accueil différentes sous Google Chrome, ils iront pointer vers le même et unique fichier ADMX nécessaire dans le Central Store.
Sous Windows Server 2003 on observerait un comportement totalement diffèrent, dans chacun des dossiers de GPO dans SYSVOL (GPT) le fichier ADM aurait été de nouveau recopié. Prenons un exemple :
Le fichier inetres.adm pèse 2,41 Mo. Si le même fichier est recopié dans chacun des dossiers on obtient pour 30 GPOs, 72 Mo. Imaginez l’impact du nombre GPOs et de fichiers ADM dans votre organisation. On peut atteindre facilement 1 Go pour 50~70 GPOs.
C’est ainsi qu’on arrive au phénomène tant redouté sous 2003, le Sysvol Bloat

Il se peut que des modèles d’administration classique (ADM) subsistent encore. Ils peuvent avoir été développé il y a des années de cela pour un produit dont le support n’est plus assuré. Afin d’optimiser vos GPOs et la taille de votre volume SYSVOL (et par extension le trafic de réplication) dès lors où vos machines exécutent Windows Vista, 7, Server 2008 ou Server 2008 R2 vous pourrez alors envisager de convertir vos fichiers ADM en ADMX dans le but de supprimer peu à peu la présence de vos anciens modèles d’administration.

Par ailleurs, Windows XP et Server 2003 ne peuvent pas utiliser le nouveau format des modèles d’administration, c’est pourquoi Microsoft ainsi que d’autres éditeurs proposent encore des modèles classiques ADM même pour les produits récents.

Cette conversion s’effectue avec une flopée d’outil que l’on retrouve sur Internet, dont celui proposé par Microsoft.

L’outil reste très intuitif et la conversion de vos fichiers ADM s’avérera être un jeu d’enfant. Attention cependant à la conversion des fichiers ADM « exotique ». S’ils sont mal développés, il se peut que des erreurs remontent lors du processus et que quelques paramètres de votre ADM ne soient plus supportés.

Qu’en est-il pour les GPOs existantes ?

On peut en profiter pour « faire le ménage » et supprimer les GPOs dont l’ensemble des paramètres sont désactivés.
Celles qui ont été créées à l’époque sur le contrôleur de domaine sous Windows Server 2003 pourront être purgées de leurs modèles « hérités ». Les plus courageux peuvent également les supprimer et en créer de nouvelles à partir des outils 2008 utilisant le Central Store.

clip_image011

Avec l’élévation du niveau fonctionnel vers du Windows Server 2008 vous gagnez une nouveauté : la possibilité d’utiliser DFSR pour la réplication du volume Sysvol.

Anciennement le répertoire commun à tous nos DCs était répliqué via NT FRS. DFSR Ayant fait ses preuves depuis de nombreuses années et ses évolutions successives font de lui le meilleur allié pour la réplication au niveau fichier dans l’environnement Microsoft.

Si vous installez votre 1er contrôleur de domaine sous Windows 2008, celui-ci sera déjà DFSR replication-ready alors que dans le cadre de montée en version 200x – 2008 vos nouveaux DCs répliqueront SYSVOL uniquement via NTFRS.

De même si vous supprimez tous vos DCs 2003, vos contrôleurs de domaines 2008 répliqueront toujours avec FRS.
La migration de la réplication de FRS à DFS est un processus manuel, nécessaire uniquement dans les scénarios d’upgrade. Il s’effectue en plusieurs phases autour d’un utilitaire dfsrmig. Pour ne pas réinventer la roue une procédure est disponible sur Technet et également sur ce post de Benoit Sautiere