TUTOS.EU

Logonscript en VbScript pour monter des lecteurs réseaux

Comment faire un logonscript en VbScript pour monter des lecteurs réseaux à l'ouverture de session

Le script

'Script que l'on peut placer dans le répertoire Netlogon des DC par exemple. Exemple d'emplacement du partage Netlogon sur un DC
'C:\Windows\SYSVOL\sysvol\NomDomaine\SCRIPTS

Dim MyCommand
Dim WSHShell, MonExe, PIDMonExe

Set WSHShell = CreateObject("WScript.Shell")

On Error Resume Next

MyCommand = "Net Use I: /Delete"
WSHShell.Run MyCommand

MyCommand = "Start Net Use J: /Delete"
WSHShell.Run MyCommand

WScript.Sleep 500 'Attente de 0,5 secondes

MyCommand = "cmd /c start Net Use I: ""\\NomServeur\NomPartage 01"""
WSHShell.Run MyCommand

MyCommand = "cmd /c Start Net Use J: ""\\NomServeur\NomPartage 02"""
WSHShell.Run MyCommand

Set WSHShell = Nothing
Lien vers le fichier : cliquez ici Copier le code

Logon script qui monte le second lecteur réseau en fonction des groupes du logon qui se connecte.
Dans ce script, seul les groupes d'une OU donnée sont comparés.
Si la personne est membre d'un groupe de l'OU examinée, alors un lecteur réseau est monté en fonction du nom du groupe.

Option Explicit

'Script placé sur le répertoire local du DC dans :
'C:\Windows\SYSVOL\sysvol\NomDomaine\SCRIPTS

Dim WSHShell, MyCommand
Dim ReturnGroupName


Set WSHShell = CreateObject("WScript.Shell")

On Error Resume Next

MyCommand = "Net Use I: /Delete"
WSHShell.Run MyCommand

MyCommand = "Net Use J: /Delete"
WSHShell.Run MyCommand

WScript.Sleep 500 'Attente de 0,5 secondes

MyCommand = "cmd /c start Net Use I: ""\\NomServeurFichiers\NomPartage01"""
WSHShell.Run MyCommand


ReturnGroupName = FindGroupName()
If Len(ReturnGroupName) > 0 Then

	MyCommand = "cmd /c Start Net Use J: ""\\NomServeurFichiers\Stations\" & ReturnGroupName & """"
	'Wscript.echo MyCommand
	WSHShell.Run MyCommand

End If

Set WSHShell = Nothing


Function FindGroupName()

	Dim MyDistinguishedName
	Dim WSHNetwork
	Dim DomainString, UserString
	Dim objRootDSE, objItem, objConnection, objCommand, objRecordSet, objRecordSetforGroups, MyCommandText
	Dim strContainer, strname
	Dim sAMAccountName, objUser, objmemberOf, objGroup, objOneGroup
	Dim strOU, LineWithGroups, GroupsArray, OneGroupName, GroupeTrouve

	Const ADS_UF_ACCOUNTDISABLE = 2 
	Const ADS_SCOPE_SUBTREE = 2

    'Return a groupname default value
    FindGroupName = ""
	
	strOU = "OU=VDI_VIEW" 'Nom de l'OU qui contient les groupes avec lesquels on va faire une comparaison
	'strContainer = "" 'Si vous souhaitez vous connecter à une OU en particulié, indiquez la ici

	Set WSHNetwork = CreateObject("WScript.Network")

	DomainString = Wshnetwork.UserDomain
	UserString = WSHNetwork.UserName

	sAMAccountName = UserString

	'Wscript.echo "Login : " & UserString

	If Len(sAMAccountName) > 0 Then
		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;"
		
		'Récupération des groupes de l OU
		Set objCommand = CreateObject("ADODB.Command") 
		objCommand.ActiveConnection = objConnection 
		
		objCommand.CommandText = "<LDAP://" & strOU & "," & objRootDSE.Get("defaultNamingContext") & ">;(objectCategory=Group);name,cn,displayName,sAMAccountName,distinguishedName,member;subtree"
		objCommand.Properties("Page Size") = 10000
		objCommand.Properties("Timeout") = 30
		objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
		objCommand.Properties("Cache Results") = False
		Set objRecordSet = objCommand.Execute 	
		'WScript.echo "Liste des groupes"
		LineWithGroups = ""
		Do Until objRecordset.EOF
			LineWithGroups = LineWithGroups & objRecordset.Fields("sAMAccountName") & ";"
			'WScript.echo VbTab & objRecordset.Fields("sAMAccountName")
			objRecordset.MoveNext
		Loop	
		objRecordSet.Close
		Set objRecordSet = Nothing
		
		If Len(LineWithGroups) > 1 Then LineWithGroups = Left(LineWithGroups,Len(LineWithGroups)-1) 'On retire le dernier caractère, soit ;
		
		'Si on a récupéré des groupes
		If Len(LineWithGroups) > 0 Then
			GroupsArray = Split(LineWithGroups,";")

			'Listage des groupes du users
			Set objCommand = CreateObject("ADODB.Command") 
			objCommand.ActiveConnection = objConnection 
			objCommand.CommandText = "<LDAP://" & MyDistinguishedName & ">;(&(objectCategory=User)(sAMAccountName=" & sAMAccountName & "));name,cn,displayName,sn,mail,mailNickname,sAMAccountName,distinguishedName,memberof;subtree"

			Set objRecordSet = objCommand.Execute 
			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 & "sn : " & VbTab & objRecordset.Fields("sn")
				'WScript.echo VbTab & "mail : " & VbTab & objRecordset.Fields("mail")
				'WScript.echo VbTab & "mailNickname : " & VbTab & objRecordset.Fields("mailNickname")
				'WScript.echo VbTab & "sAMAccountName : " & VbTab & objRecordset.Fields("sAMAccountName")
				'WScript.echo VbTab & "distinguishedName : " & VbTab & objRecordset.Fields("distinguishedName")
				'WScript.echo ""

				objmemberOf = objRecordset.Fields("memberof")
				MyCommandText = ""
				GroupeTrouve = 0
				For Each objGroup in objmemberOf
					If GroupeTrouve = 0 Then
						'Wscript.echo "Connexion à : " & objGroup
						Set objOneGroup = GetObject("LDAP://" & objGroup)
						'WScript.echo VbTab & objOneGroup.sAMAccountName

						'On liste les groupes qui existent dans l'OU visée
						For Each OneGroupName In GroupsArray
							'WScript.echo VbTab & OneGroupName
							If OneGroupName = objOneGroup.sAMAccountName Then
								'WScript.echo "Trouvé ! : " & OneGroupName
								GroupeTrouve = 1
								FindGroupName = OneGroupName
								Exit For
							End If
						Next
					
					End If
					Set objOneGroup = Nothing
				Next
				
				objRecordset.MoveNext
			Loop
			objRecordSet.Close

		End If
		objConnection.Close
	Else
		'Wscript.echo "Login vierge : Arrêt"
	End If

	Set WSHNetwork = Nothing

End Function
Lien vers le fichier : cliquez ici Copier le code

Variante ou le montage des lecteurs réseaux ne se fait pas avec un net use mais via VBScript

Option Explicit

'Script placé sur le répertoire local du DC dans :
'C:\Windows\SYSVOL\sysvol\nomdomaine.local\SCRIPTS

Dim WSHShell, MyCommand
Dim ReturnGroupName
Dim WSHNetwork, sAMAccountName

Const CstLogger = 1 'A 1 si on log dans un fichier texte situé dans le même répertoire que le script
Const CstListeGroupesLecteurK = "NomGroupe1;NomGroupe2" 'Liste des groupes qui donnent droit au montage du lecteur K pour le répertoire multimédia

Wscript.echo "Demarrage : " & Now
WScript.Sleep 5000 'Attente de 5s
Wscript.echo "Attente passée : " & Now


Dim CheminScriptActuel, ScriptFileName, Position
Dim objFSO
Dim objTextFile
Dim CheminFichier

'Déclaration des constantes
Const ForReading = 1
Const ForWritting = 2
Const ForAppending = 8

CheminScriptActuel = Left(wscript.scriptfullname,Len(wscript.scriptfullname)-Len(wscript.scriptname)-1)
ScriptFileName = wscript.scriptname
Position = InstrRev(ScriptFileName,".")
if (Position > 0) Then ScriptFileName = Left(ScriptFileName, Position - 1)
CheminFichier = CheminScriptActuel & "\" & ScriptFileName & "_Log.txt" 'Déclaration du chemin et du nom du fichier

If CstLogger = 1 Then
	If Len(CheminFichier) > 0 Then
		Set objFSO = CreateObject("Scripting.FileSystemObject")
		Set objTextFile = objFSO.OpenTextFile(CheminFichier, ForWritting, True)
		objTextFile.WriteLine(Now) 'On ecrit la date et l'heure dans le fichier
		'objTextFile.Close 'Fermeture du fichier

		'Set objTextFile = Nothing
		'Set objFSO = Nothing
	Else
		Wscript.echo "Operation annulee"
	End If 'CheminFichier
End If


Set WSHShell = CreateObject("WScript.Shell")
Set WSHNetwork = CreateObject("WScript.Network")
sAMAccountName = WSHNetwork.UserName
	
	
Err.Clear
On Error Resume Next
If CstLogger = 1 Then objTextFile.WriteLine("Remove U")
WSHNetwork.RemoveNetworkDrive "U:"
If CstLogger = 1 Then objTextFile.WriteLine("Remove U : " & Err.number & " - " & Err.Description)
WScript.Sleep 1000 'Attente


Err.Clear
Wscript.echo "Montage du lecteur U : " & Now
If CstLogger = 1 Then objTextFile.WriteLine("Create U : ")
WSHNetwork.MapNetworkDrive "U:" , "\\NomServeur\NomPartage"
If CstLogger = 1 Then objTextFile.WriteLine("Error ? : " & Err.number & " - " & Err.Description)

'Pour le montage du lecteur J :
ReturnGroupName = FindGroupName() 'Recherche du groupe qui indique l'appartenance à qqchose
Wscript.echo "ReturnGroupName : " & ReturnGroupName & " " & Now
If CstLogger = 1 Then objTextFile.WriteLine("ReturnGroupName : " & ReturnGroupName)
If Len(ReturnGroupName) > 0 Then
	Err.Clear
	If CstLogger = 1 Then objTextFile.WriteLine("Create J pour le groupe " & ReturnGroupName)
	WSHNetwork.MapNetworkDrive "J:" , "\\NomServerFichiers\Stations\" & ReturnGroupName
End If

'Pour le montage du lecteur K :
If CstLogger = 1 Then objTextFile.WriteLine("Montage du lecteur K sur \\NomServerFichiers\NomPartage")
Err.Clear
WSHNetwork.MapNetworkDrive "K:" , "\\NomServerFichiers\NomPartage"
If CstLogger = 1 Then objTextFile.WriteLine("Error ? : " & Err.number & " - " & Err.Description)

If CstLogger = 1 Then objTextFile.Close 'Fermeture du fichier
	
Set WSHShell = Nothing


Function FindGroupName()

	Dim MyDistinguishedName
	Dim WSHNetwork
	Dim DomainString, UserString
	Dim objRootDSE, objItem, objConnection, objCommand, objRecordSet, objRecordSetforGroups, MyCommandText
	Dim strContainer, strname
	Dim sAMAccountName, objUser, objmemberOf, objGroup, objOneGroup, GroupName
	Dim strOU, LineWithGroups, GroupsArray, OneGroupName, GroupeTrouve

	Const ADS_UF_ACCOUNTDISABLE = 2 
	Const ADS_SCOPE_SUBTREE = 2

    'Return a groupname default value
    FindGroupName = ""
	
	strOU = "OU=NomOU" 'Nom de l'OU qui contient les groupes avec lesquels on va faire une comparaison
	'strContainer = "" 'Si vous souhaitez vous connecter à une OU en particulié, indiquez la ici

	'Récupération du domaine et login de la personne
	Set WSHNetwork = CreateObject("WScript.Network")
	DomainString = Wshnetwork.UserDomain
	UserString = WSHNetwork.UserName
	sAMAccountName = UserString

	If Len(sAMAccountName) > 0 Then
		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;"
		
		'Récupération des groupes de l OU
		Set objCommand = CreateObject("ADODB.Command") 
		objCommand.ActiveConnection = objConnection 
		
		objCommand.CommandText = "<LDAP://" & strOU & "," & objRootDSE.Get("defaultNamingContext") & ">;(objectCategory=Group);name,cn,displayName,sAMAccountName,distinguishedName,member;subtree"
		objCommand.Properties("Page Size") = 10000
		objCommand.Properties("Timeout") = 30
		objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
		objCommand.Properties("Cache Results") = False
		Set objRecordSet = objCommand.Execute 	
		'WScript.echo "Liste des groupes"
		LineWithGroups = ""
		Do Until objRecordset.EOF
			GroupName = objRecordset.Fields("sAMAccountName")
			GroupName = Trim(GroupName)
			If (Left(Lcase(GroupName), 3)) <> "grp" Then 'Exclusion des groupes qui commencent par Grp
				LineWithGroups = LineWithGroups & GroupName & ";"
				'WScript.echo VbTab & objRecordset.Fields("sAMAccountName")
			End If

			objRecordset.MoveNext
		Loop	
		objRecordSet.Close
		Set objRecordSet = Nothing
		
		If Len(LineWithGroups) > 1 Then LineWithGroups = Left(LineWithGroups,Len(LineWithGroups)-1) 'On retire le dernier caractère, soit ;
		
		'Si on a récupéré des groupes
		If Len(LineWithGroups) > 0 Then
			GroupsArray = Split(LineWithGroups,";")

			'Listage des groupes du users
			Set objCommand = CreateObject("ADODB.Command") 
			objCommand.ActiveConnection = objConnection 
			objCommand.CommandText = "<LDAP://" & MyDistinguishedName & ">;(&(objectCategory=User)(sAMAccountName=" & sAMAccountName & "));name,cn,displayName,sn,mail,mailNickname,sAMAccountName,distinguishedName,memberof;subtree"

			Set objRecordSet = objCommand.Execute 
			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 & "sn : " & VbTab & objRecordset.Fields("sn")
				'WScript.echo VbTab & "mail : " & VbTab & objRecordset.Fields("mail")
				'WScript.echo VbTab & "mailNickname : " & VbTab & objRecordset.Fields("mailNickname")
				'WScript.echo VbTab & "sAMAccountName : " & VbTab & objRecordset.Fields("sAMAccountName")
				'WScript.echo VbTab & "distinguishedName : " & VbTab & objRecordset.Fields("distinguishedName")
				'WScript.echo ""

				objmemberOf = objRecordset.Fields("memberof")
				MyCommandText = ""
				GroupeTrouve = 0
				For Each objGroup in objmemberOf
					If GroupeTrouve = 0 Then
						'Wscript.echo "Connexion à : " & objGroup
						Set objOneGroup = GetObject("LDAP://" & objGroup)
						'WScript.echo VbTab & objOneGroup.sAMAccountName

						'On liste les groupes qui existent dans l'OU visée
						For Each OneGroupName In GroupsArray
							'WScript.echo VbTab & OneGroupName
							If OneGroupName = objOneGroup.sAMAccountName Then
								'WScript.echo "Trouvé ! : " & OneGroupName
								GroupeTrouve = 1
								FindGroupName = OneGroupName
								Exit For
							End If
						Next
					
					End If
					Set objOneGroup = Nothing
				Next
				
				objRecordset.MoveNext
			Loop
			objRecordSet.Close

		End If
		objConnection.Close
	Else
		'Wscript.echo "Login vierge : Arrêt"
	End If

	Set WSHNetwork = Nothing

End Function

Function FindIfOnGroup(ByVal sAMAccountName, ByVal varGroupList)

	Dim MyDistinguishedName
	Dim objRootDSE, objItem, objConnection, objCommand, objRecordSet, objRecordSetforGroups, MyCommandText
	Dim strContainer, strname, strGroupName, arrGroups
	Dim objUser, objmemberOf, objGroup, objOneGroup

	FindIfOnGroup = 0 'Valeur de retour par défaut

	Const ADS_UF_ACCOUNTDISABLE = 2 
	Const ADS_SCOPE_SUBTREE = 2

	If Len(sAMAccountName) > 0 Then
		WScript.echo "Recherche des groupes du compte " & sAMAccountName 
		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

		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 
		objCommand.CommandText = "<LDAP://" & MyDistinguishedName & ">;(&(objectCategory=User)(sAMAccountName=" & sAMAccountName & "));name,cn,displayName,sn,mail,mailNickname,sAMAccountName,distinguishedName,memberof;subtree"

		objCommand.Properties("Page Size") = 10000
		objCommand.Properties("Timeout") = 30
		objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
		objCommand.Properties("Cache Results") = False

		Set objRecordSet = objCommand.Execute 
		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 & "sn : " & VbTab & objRecordset.Fields("sn")
			'WScript.echo VbTab & "mail : " & VbTab & objRecordset.Fields("mail")
			'WScript.echo VbTab & "mailNickname : " & VbTab & objRecordset.Fields("mailNickname")
			'WScript.echo VbTab & "sAMAccountName : " & VbTab & objRecordset.Fields("sAMAccountName")
			'WScript.echo VbTab & "distinguishedName : " & VbTab & objRecordset.Fields("distinguishedName")
			'WScript.echo ""

			objmemberOf = objRecordset.Fields("memberof")
			MyCommandText = ""
			arrGroups = split(varGroupList,";")
			For Each objGroup in objmemberOf 'Pour tous les groupes du user
				'Wscript.echo "Connexion à : " & objGroup
				Set objOneGroup = GetObject("LDAP://" & objGroup)
				'WScript.echo VbTab & objOneGroup.sAMAccountName 'Affichage d'un nom de groupe auquel le user appartient

				For Each strGroupName in arrGroups
					WScript.echo sAMAccountName & " est membre du groupe " & objOneGroup.sAMAccountName
					WScript.echo VbTab & "Recherche si " & sAMAccountName & " appartient au groupe " & strGroupName
					If Lcase(objOneGroup.sAMAccountName) = Lcase(strGroupName) Then
						FindIfOnGroup = 1 'Si la personne fait parti du groupe recherché, on le dit en le retournant via la fonction
						WScript.echo VbTab & sAMAccountName & " est bien membre du groupe " & strGroupName
						'Exit For
						Exit Function
					End If
				Next
				
				Set objOneGroup = Nothing
			Next
			
			objRecordset.MoveNext
		Loop
		objRecordSet.Close
		objConnection.Close
	Else
		Wscript.echo "Login vierge : Arrêt"
	End If

End Function
Lien vers le fichier : cliquez ici Copier le code

Article(s) en relation(s)

2