'Extraction des groupes et users en accès sur une ferme Citrix XenApp 5 'Exploration des groupes de façon récursive (nested) pour en extraire tous les utilisateurs potentiels 'Au final calcul du nombre total d'utilisateurs uniques ayant accès à la ferme Citrix, qu'il soit dans un groupe ou non 'Version du 31 mars 2015 Sub DetectExeType() 'Version du 10 juillet 2008 Dim ScriptHost Dim ShellObject Dim CurrentPathExt Dim EnvObject Dim RegCScript Dim RegPopupType ' This is used to set the pop-up box flags. ' I couldn't find the pre-defined names RegPopupType = 32 + 4 On Error Resume Next ScriptHost = WScript.FullName ScriptHost = Right(ScriptHost, Len(ScriptHost) - InStrRev(ScriptHost, "\")) If (UCase(ScriptHost) = "WSCRIPT.EXE") Then WScript.Echo ("This script does not work with WScript.") ' Create a pop-up box and ask if they want to register cscript as the default host. Set ShellObject = WScript.CreateObject("WScript.Shell") ' -1 is the time to wait. 0 means wait forever. RegCScript = ShellObject.PopUp("Would you like to register CScript as your default host for VBscript?", 0, "Register CScript", RegPopupType) If (Err.Number <> 0) Then ReportError () WScript.Echo "To run this script using CScript, type: ""CScript.exe " & WScript.ScriptName & """" WScript.Quit (GENERAL_FAILURE) WScript.Quit (Err.Number) End If ' Check to see if the user pressed yes or no. Yes is 6, no is 7 If (RegCScript = 6) Then ShellObject.RegWrite "HKEY_CLASSES_ROOT\VBSFile\Shell\Open\Command\", "%WINDIR%\System32\CScript.exe //nologo ""%1"" %*", "REG_EXPAND_SZ" ShellObject.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\VBSFile\Shell\Open\Command\", "%WINDIR%\System32\CScript.exe //nologo ""%1"" %*", "REG_EXPAND_SZ" ' Check if PathExt already existed CurrentPathExt = ShellObject.RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\PATHEXT") If Err.Number = &H80070002 Then Err.Clear Set EnvObject = ShellObject.Environment("PROCESS") CurrentPathExt = EnvObject.Item("PATHEXT") End If ShellObject.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\PATHEXT", CurrentPathExt & ";.VBS", "REG_SZ" If (Err.Number <> 0) Then ReportError () WScript.Echo "Error Trying to write the registry settings!" WScript.Quit (Err.Number) Else WScript.Echo "Successfully registered CScript" End If Else WScript.Echo "To run this script type: ""CScript.Exe adsutil.vbs """ End If Dim ProcString Dim ArgIndex Dim ArgObj Dim Result ProcString = "Cscript //nologo " & WScript.ScriptFullName Set ArgObj = WScript.Arguments For ArgIndex = 0 To ArgCount - 1 ProcString = ProcString & " " & Args(ArgIndex) Next 'Now, run the original executable under CScript.exe Result = ShellObject.Run(ProcString, 0, True) WScript.Quit (Result) End If End Sub '**************************************************************************** ' 'pubAppRpt.vbs ' 'Description: Write to the cmd session a list of all published apps and the ' users and groups assigned to them. ' 'Usage: e.g. >cscript pubAppRpt.vbs ' '**************************************************************************** Call DetectExeType() Dim ListeDesGroupes Dim mfFarm Dim mfApp Dim mfGrp Dim mfUsr Dim dicCitrixGroups 'Dictionnaire avec les groupes qui donnent accès à une appli Citrix set dicCitrixGroups = CreateObject("Scripting.Dictionary") Dim dicCitrixUsers 'Dictionnaire avec les users qui sont directement affectés à une appli Citrix set dicCitrixUsers = CreateObject("Scripting.Dictionary") Dim varListeGroupes, varListeComptes varListeGroupes = "" varListeComptes = "" Set mfFarm = CreateObject("MetaFrameCOM.MetaFrameFarm") if Err.Number <> 0 Then WScript.Echo "Can't create MetaFrameFarm object" WScript.Echo "(" & Err.Number & ") " & Err.Description WScript.Quit Err.Number End if mfFarm.Initialize 1 'mfFarm.Initialize(MetaFrameWinFarmObject) if Err.Number <> 0 Then Wscript.Echo "Can't Initialize MetaFrameFarm object" Wscript.Echo "(" & Err.Number & ") " & Err.Description WScript.Quit Err.Number End if If mfFarm.WinFarmObject.IsCitrixAdministrator = 0 then Wscript.Echo "You must be a Citrix admin to run this script" WScript.Quit 0 End If WScript.Echo "MetaFrame Farm Name: " & mfFarm.FarmName WScript.Echo "" WScript.Echo "Published Applications : " WScript.Echo "Stockage dans 2 dictionnaires des groupes et users en accès sur la ferme Citrix " & mfFarm.FarmName & " : " For Each mfApp In mfFarm.Applications mfApp.LoadData 1 WScript.Echo vbTab & mfApp.Appname 'WScript.Echo vbTab & vbTab & "Groups" For Each mfGrp In mfApp.Groups 'WScript.Echo vbTab & vbTab & vbTab & mfGrp.GroupName 'varListeGroupes = varListeGroupes & mfGrp.GroupName & ";" if dicCitrixGroups.Exists(mfGrp.GroupName) then 'Do Nothing else 'WScript.echo "Ajout d'un user : " & objMember.ADsPath 'dicCitrixGroups.Add objMember.ADsPath, objMember.sAMAccountName If Len(Trim(mfGrp.GroupName)) > 0 Then dicCitrixGroups.Add mfGrp.GroupName, mfGrp.GroupName end if Next 'WScript.Echo vbTab & vbTab & "Users" For Each mfUsr In mfApp.Users 'WScript.Echo vbTab & vbTab & vbTab & mfUsr.UserName 'varListeComptes = varListeComptes & mfUsr.UserName & ";" if dicCitrixUsers.Exists(mfUsr.UserName) then 'Do Nothing else 'WScript.echo "Ajout d'un user : " & objMember.ADsPath 'dicCitrixGroups.Add objMember.ADsPath, objMember.sAMAccountName If Len(Trim(mfUsr.UserName)) > 0 Then dicCitrixUsers.Add mfUsr.UserName, mfUsr.UserName end if Next Next Set mfFarm = Nothing WScript.Echo "" 'WScript.Echo "varListeGroupes : " & varListeGroupes 'WScript.Echo "varListeComptes : " & varListeComptes 'Affichage des groupes en accès ListeDesGroupes = "" WScript.Echo "" WScript.Echo "Groupes en accès sur une publication : " varMesCles=dicCitrixGroups.keys For varCompteur=0 To ubound(varMesCles) WScript.Echo VbTab & dicCitrixGroups.item(varMesCles(varCompteur)) ListeDesGroupes = ListeDesGroupes & dicCitrixGroups.item(varMesCles(varCompteur)) & ";" 'Stockage des groupes en accès sur une publication Citrix dans une variable Next ListeDesGroupes = Left(ListeDesGroupes, Len(ListeDesGroupes)-1) 'On vire le ; en trop situé à droite 'Affichage des users en accès direct WScript.Echo "" WScript.Echo "Users en accès direct sur une publication Citrix : " varMesCles=dicCitrixUsers.keys For varCompteur=0 To ubound(varMesCles) 'wscript.echo "dicCitrixUsers(" & varMesCles(varCompteur) & ")=" & dicCitrixUsers.item(varMesCles(varCompteur)) 'wscript.echo dicCitrixUsers.item(varMesCles(varCompteur)) WScript.Echo VbTab & dicCitrixUsers.item(varMesCles(varCompteur)) Next 'Maintenant on va traiter les groupes membres des groupes 'WScript.Echo "Liste des groupes" 'WScript.Echo ListeDesGroupes WScript.Echo "" WScript.Echo "Exploration des membres contenus dans les groupes qui donnent accès à une publication Citrix" 'Option Explicit Dim MyDistinguishedName Dim objRootDSE, objItem, objConnection, objCommand, objRecordSet Dim strContainer, strname Dim intCounter Dim dicSeenGroupMember 'Dictionnaire qui va contenir la liste des membres uniques de tous les groupes injectés en entrée set dicSeenGroupMember = CreateObject("Scripting.Dictionary") Dim varObjectCategory, varPosition Dim varCompteur, varMesCles, varMesValeurs Dim objFSO, objTextFile Dim NomFichier, CheminFichier, CheminScriptActuel, ScriptFileName, Position Dim CompteurTotal Dim varUnGroup, varArrayGroups, varFiltreRequeteAD strContainer = "" 'Si vous souhaitez vous connecter à une OU en particulié, indiquez la ici Const ADS_UF_ACCOUNTDISABLE = 2 Const ADS_SCOPE_SUBTREE = 2 Const ForReading = 1 Const ForWritting = 2 Const ForAppending = 8 ScriptFileName = wscript.scriptname Position = InstrRev(ScriptFileName,".") if (Position > 0) Then ScriptFileName = Left(ScriptFileName, Position - 1) NomFichier = ScriptFileName & "_out.txt" CheminScriptActuel = Left(wscript.scriptfullname,Len(wscript.scriptfullname)-Len(wscript.scriptname)-1) CheminFichier = CheminScriptActuel & "\" & NomFichier 'Déclaration du chemin et du nom du fichier If Len(CheminFichier) > 0 Then Set objFSO = CreateObject("Scripting.FileSystemObject") Set objTextFile = objFSO.OpenTextFile(CheminFichier, ForWritting, True) On Error Resume Next Set objRootDSE = GetObject("LDAP://rootDSE") If strContainer = "" Then Set objItem = GetObject("LDAP://" & objRootDSE.Get("defaultNamingContext")) Else Set objItem = GetObject("LDAP://" & strContainer & "," & _ objRootDSE.Get("defaultNamingContext")) End If On Error Goto 0 'strname = objItem.Get("name") 'WScript.Echo "name: " & strname MyDistinguishedName = objItem.Get("distinguishedName") 'Récupération du distinguishedName du domaine par défaut. Exemple DC=Cotonso,DC=Com 'WScript.Echo "distinguishedName: " & MyDistinguishedName Set objConnection = CreateObject("ADODB.Connection") objConnection.Open "Provider=ADsDSOObject;" Set objCommand = CreateObject("ADODB.Command") objCommand.ActiveConnection = objConnection 'Pour une liste de groupes donnés, on sort les membres varArrayGroups = Split(ListeDesGroupes, ";") varFiltreRequeteAD = "" For Each varUnGroup in varArrayGroups varFiltreRequeteAD = varFiltreRequeteAD & "(sAMAccountName=" & varUnGroup & ")" Next 'WScript.echo "Filtre requete ldap pour les groupes : " & varFiltreRequeteAD 'objCommand.CommandText = ";(objectCategory=Group);name,cn,displayName,sAMAccountName,distinguishedName,member;subtree" 'objCommand.CommandText = ";(&(objectCategory=Group)(|(sAMAccountName=aeff1 nom affiche dans AD)(sAMAccountName=aeff2)));name,cn,displayName,sAMAccountName,distinguishedName,member,objectCategory;subtree"' objCommand.CommandText = ";(&(objectCategory=Group)(|" & varFiltreRequeteAD & "));name,cn,displayName,sAMAccountName,distinguishedName,member,objectCategory;subtree"' objCommand.Properties("Page Size") = 10000 objCommand.Properties("Timeout") = 30 objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE objCommand.Properties("Cache Results") = False 'On liste les membres. 'On ajoute dans le dictionnaire que les users qui n'y sont pas déjà 'Si c'est un groupe, on liste les membres et on ajout les membres de type user au dictionnaire si ils n'y sont pas déjà. Si un membre est un groupe, on liste les membres de ce groupe etc ... Set objRecordSet = objCommand.Execute intCounter = 0 Do Until objRecordset.EOF 'WScript.echo objRecordset.Fields("distinguishedName") 'WScript.echo "Name : " & VbTab & objRecordset.Fields("Name") 'WScript.echo VbTab & "cn : " & VbTab & objRecordset.Fields("cn") 'WScript.echo VbTab & "displayName : " & VbTab & objRecordset.Fields("displayName") 'WScript.echo VbTab & "sAMAccountName : " & VbTab & objRecordset.Fields("sAMAccountName") 'WScript.echo VbTab & "distinguishedName : " & VbTab & objRecordset.Fields("distinguishedName") 'WScript.echo VbTab & "objectCategory : " & VbTab & objRecordset.Fields("objectCategory") 'WScript.echo "Exploration de " & objRecordset.Fields("distinguishedName") Call ExplorerGroupeEtAjoutMembresDansDico(objRecordset.Fields("distinguishedName"),dicSeenGroupMember) objRecordset.MoveNext Loop objConnection.Close 'Le dico dicSeenGroupMember contient actuellement les membres des groupes qui étaient en accès sur la ferme Citrix 'Il faut maintenant y ajouter les users qui sont directement en accès sur une appli de la ferme 'Les users qui sont directement en accès sur une appli de la ferme sont dans le dico nommé WScript.Echo "Ajout au dictionnaire des users directement en accès sur une appli de la ferme : " varMesCles=dicCitrixUsers.keys For varCompteur=0 To ubound(varMesCles) varUnUserEnAccesDirect = dicCitrixUsers.item(varMesCles(varCompteur)) WScript.Echo VbTab & varUnUserEnAccesDirect if dicSeenGroupMember.Exists(varUnUserEnAccesDirect) then 'Do Nothing else WScript.echo VbTab & "Ajout de " & varUnUserEnAccesDirect dicSeenGroupMember.Add varUnUserEnAccesDirect, varUnUserEnAccesDirect end if Next 'On affiche le contenu du dico qui correspond aux membres des groupes qui étaient en accès sur la ferme Citrix + les users qui ont un accès direct Wscript.echo "Ecriture dans le fichier des membres en accès sur la ferme Citrix" CompteurTotal = 0 varMesCles=dicSeenGroupMember.keys For varCompteur=0 To ubound(varMesCles) 'wscript.echo "dicSeenGroupMember(" & varMesCles(varCompteur) & ")=" & dicSeenGroupMember.item(varMesCles(varCompteur)) 'wscript.echo dicSeenGroupMember.item(varMesCles(varCompteur)) objTextFile.WriteLine(dicSeenGroupMember.item(varMesCles(varCompteur))) CompteurTotal = CompteurTotal + 1 Next objTextFile.WriteLine("") objTextFile.WriteLine("Nombre total de users uniques : " & CompteurTotal) objTextFile.Close 'Fermeture du fichier Set objTextFile = Nothing Set objFSO = Nothing Else Wscript.echo "Operation annulee" End If 'CheminFichier Function ExplorerGroupeEtAjoutMembresDansDico (ByVal GroupDistinguishedName, ByRef dicSeenGroupMember) Dim ObjGroupAExplorer, objMember 'Wscript.echo "Exploration du groupe " & GroupDistinguishedName Set ObjGroupAExplorer = GetObject("LDAP://" & GroupDistinguishedName) for each objMember In ObjGroupAExplorer.Members If objMember.Class = "group" Then 'WScript.echo "Exploration du sous groupe " & objMember.distinguishedName Call ExplorerGroupeEtAjoutMembresDansDico(objMember.distinguishedName,dicSeenGroupMember) Else if dicSeenGroupMember.Exists(objMember.sAMAccountName) then 'Do Nothing else 'WScript.echo "Ajout d'un user : " & objMember.ADsPath 'dicSeenGroupMember.Add objMember.ADsPath, objMember.sAMAccountName 'dicSeenGroupMember.Add objMember.ADsPath, objMember.DisplayName dicSeenGroupMember.Add objMember.sAMAccountName, objMember.sAMAccountName CompteurTotal = CompteurTotal + 1 end if End If next End Function