TUTOS.EU

Copier un fichier à l'ouverture/fermeture de session pour un profil itinérant

Copie d'un fichier dans le profil local depuis le homefolder à l'ouverture de session et inversement en VbScript

Introduction

Le script a pour but de copier un fichier à l'ouverture/fermeture de session pour les personnes utilisant un profil itinérant.

En effet le répertoire AppData\Local n'est pas pris en compte de base dans le profil itinérant et certains programmes peuvent y stocker des fichiers comme une licence.

Le Vbscript proposé ne prend en charge la copie que d'un fichier dont le chemin est codé en dur.

C'est une base de travail.

Il reçoit un paramètre dont la valeur est « logon » ou « logoff » afin de n'avoir qu'un seul script dans les 2 cas.

Le script se comporte donc différemment suivant qu’il reçoit le paramètre « logon » ou « logoff »

« logon » est le paramètre par défaut.

Lors d’un logon le script va chercher son fichier à la racine du HomeFolder de la personne.

Il copie le fichier dans le profil local dans %USERPROFILE%\Local\ etc ...

A l’inverse lors d’un logoff le script prend le fichier dans le profil local puis il le copie dans le homefolder de la personne.

Un fichier de log par serveur et par logon/logoff est généré à l'emplacement du script.

Suite à tests des adaptations ont été faites, à savoir que le homefolder de l’utilisateur n’est pas toujours disponible immédiatement, aussi le script fait 10 tentatives d’accès avant d’abandonner à raison d’une tentative par seconde.

Si le répertoire cible dans le profil local n’existe pas, le script le crée.

Il pourra être nécessaire de faire lancer ce script par un .bat qui ne l'attend que quelques secondes en cas de lock du script à exécuter pour raison x ou y.

Dans mon cas le script a été déclenché par Gpo à l’ouverture et fermeture de session.

LogonLogoffScript.vbs

Option Explicit
'2014 05 27
'Copie d'un fichier à l'ouverture et fermeture de session afin qu'il soit pris en charge pour un profil itinérant

Dim objFSO, objFichierLog, CheminScriptActuel, CheminFichierdeLog, NomFichier
Dim Position, Compteur, AccesOk
Dim WSHShell
Dim vHomeDrive, vUserProfile, vUserName, vCOMPUTERNAME
Dim CheminDuHomeFolder, CheminRepertoireLicenceSurProfilLocal, CheminFichierLicenceSurHome, CheminFichierLicenceSurProfilLocal
Dim Mode
Dim objArgs, ArgCount

Const ForReading = 1
Const ForWritting = 2
Const ForAppending = 8

'Mode = "logoff"
Mode = "logon"

On Error resume next


Set objArgs = Wscript.Arguments

	ArgCount = 0
	if objArgs.Count = 0 then
		'wscript.echo "No arguments specified."
		'wscript.echo
		'call Help()
		
	Else
		Mode=LCase(objArgs(0))
		'wscript.echo "0 : " & Mode

		Select Case Mode
			Case "logon"
				Mode = "logon"
			
			Case "logoff"
				Mode = "logoff"

			Case Else
				Mode = "logon"
		End Select
		
	end if

Set objArgs = Nothing




CheminScriptActuel = Left(wscript.scriptfullname,Len(wscript.scriptfullname)-Len(wscript.scriptname)-1)

Set WSHShell = CreateObject("WScript.Shell")
vHomeDrive = WSHShell.ExpandEnvironmentStrings("%HOMEDRIVE%")
vUserProfile = WSHShell.ExpandEnvironmentStrings("%USERPROFILE%")
vUserName = WSHShell.ExpandEnvironmentStrings("%USERNAME%")
vCOMPUTERNAME = WSHShell.ExpandEnvironmentStrings("%COMPUTERNAME%")

'CheminDuHomeFolder = "\\dc.mydomain.local\homes$\" & vUserName
CheminDuHomeFolder = vHomeDrive
CheminFichierLicenceSurHome = CheminDuHomeFolder & "\" & "MonFichierACopier.ini"
CheminRepertoireLicenceSurProfilLocal = vUserProfile & "\" & "AppData\Local\MonRepertoire"
'CheminFichierLicenceSurProfilLocal = vUserProfile & "\" & "AppData\Local" & "\" & "MaLic.txt"
CheminFichierLicenceSurProfilLocal = CheminRepertoireLicenceSurProfilLocal & "\" & "MonFichierACopier.ini"

NomFichier = wscript.scriptname
Position = InstrRev(NomFichier,".")
NomFichier = Left(NomFichier, Position - 1)

CheminFichierdeLog = CheminScriptActuel & "\" & NomFichier & "_log_" & vUserName & "_" & vCOMPUTERNAME & "_" & Mode & ".txt"

Set objFSO = CreateObject("Scripting.FileSystemObject")

Err.clear
On Error Resume Next

Set objFichierLog = objFSO.OpenTextFile(CheminFichierdeLog, ForWritting, True)
objFichierLog.WriteLine(Now)

If Err.Number > 0 Then
	On error Goto 0
	Wscript.Echo "Erreur lors de la création du fichier de log " & CheminFichierdeLog & " : " & err.number & " (" & err.description & ")"
	Wscript.quit
End If

objFichierLog.WriteLine(VbTab & "Mode passé en paramètres : " & Mode)
objFichierLog.WriteLine(VbTab & "vHomeDrive : " &  vHomeDrive)
objFichierLog.WriteLine(VbTab & "vUserProfile : " &  vUserProfile)
objFichierLog.WriteLine(VbTab & "vUserName : " &  vUserName)
objFichierLog.WriteLine(VbTab & "vCOMPUTERNAME : " &  vCOMPUTERNAME)
objFichierLog.WriteLine(VbTab & "CheminFichierLicenceSurHome : " &  CheminFichierLicenceSurHome)
objFichierLog.WriteLine(VbTab & "CheminRepertoireLicenceSurProfilLocal : " &  CheminRepertoireLicenceSurProfilLocal)
objFichierLog.WriteLine(VbTab & "CheminFichierLicenceSurProfilLocal : " &  CheminFichierLicenceSurProfilLocal)

AccesOk = 0
Compteur = 0
Do 

	Compteur = Compteur + 1
	WScript.Sleep 1000 'Attente de 1 seconde
	'If objFSO.FolderExists(vHomeDrive) Then AccesOk = 1
	'If objFSO.DriveExists(vHomeDrive) Then AccesOk = 1
	If objFSO.FolderExists(CheminDuHomeFolder) Then AccesOk = 1

	'objFichierLog.WriteLine(VbTab & "Tentative d'accès numéro  " & Compteur & " à " & vHomeDrive & " : " & AccesOk)
	objFichierLog.WriteLine(VbTab & "Tentative d'accès numéro  " & Compteur & " à " & CheminDuHomeFolder & " : " & AccesOk)


Loop While (Compteur < 10) And AccesOk = 0

If AccesOk = 1 Then

	objFichierLog.WriteLine(VbTab & "HomeDrive " & vHomeDrive & " accessible")
	
	If Mode = "logoff" Then
	
		objFichierLog.WriteLine(VbTab & "Fonctionnement sur la base d'un logoff")

		'Si le fichier de licence existe sur le profil local, on va essayer de le copier sur le homefolder.
		If objFSO.FileExists(CheminFichierLicenceSurProfilLocal) Then
			objFichierLog.WriteLine(VbTab & "Le fichier est présent sur le profil local dans " & CheminFichierLicenceSurProfilLocal & " (pour indication)")

			If objFSO.FileExists(CheminFichierLicenceSurHome) Then
				objFichierLog.WriteLine(VbTab & CheminFichierLicenceSurHome & "existe. Il sera écrasé par " & CheminFichierLicenceSurProfilLocal)
			Else
				objFichierLog.WriteLine(VbTab & CheminFichierLicenceSurHome & " n'existe pas. " & CheminFichierLicenceSurProfilLocal & " va le créer")
			End If

			objFichierLog.WriteLine(VbTab & "Copie de " & CheminFichierLicenceSurProfilLocal & " sur " & CheminFichierLicenceSurHome)

			Err.clear
			On Error Resume Next
			Call objFSO.CopyFile (CheminFichierLicenceSurProfilLocal, CheminFichierLicenceSurHome, True)
			If Err.Number > 0 Then objFichierLog.WriteLine(VbTab & "Erreur lors de l'écriture du fichier sur le Home Folder. Code de retour de l'erreur : " & err.number & " (" & err.description & ")")
			On error Goto 0

		Else
			objFichierLog.WriteLine(VbTab & "Absence sur fichier dans le profil local. Il aurait dû être ici : " & CheminFichierLicenceSurProfilLocal & " (pour indication)")
		End If
	
	End If

	If Mode = "logon" Then
	
		objFichierLog.WriteLine(VbTab & "Fonctionnement sur la base d'un logon")
		
		'Lors d'un logon, on regarde si un fichier existe sur le home folder. Si oui, on le copie dans tous les cas dans le profil local
		If objFSO.FileExists(CheminFichierLicenceSurHome) Then
			objFichierLog.WriteLine(VbTab & CheminFichierLicenceSurHome & " existe")

			'Test de la présence du répertoire qui doit contenir le fichier de licence et création si abscence
			If objFSO.FolderExists(CheminRepertoireLicenceSurProfilLocal) Then
				objFichierLog.WriteLine(VbTab & "Le répertoire qui doit contenir le fichier de licence existe, cad " & CheminRepertoireLicenceSurProfilLocal)
			Else
				objFichierLog.WriteLine(VbTab & "Absence du répertoire qui doit contenir le fichier de licence, cad " & CheminRepertoireLicenceSurProfilLocal)
				objFichierLog.WriteLine(VbTab & "Création de " & CheminRepertoireLicenceSurProfilLocal)
				WSHShell.Run "cmd /c mkdir """ & CheminRepertoireLicenceSurProfilLocal & """"
				
				WScript.Sleep 2000 'Attente de 2 seconde
			End If
			
			'Second test du répertoire qui doit contenir le fichier de licence
			If objFSO.FolderExists(CheminRepertoireLicenceSurProfilLocal) = True Then
				objFichierLog.WriteLine(VbTab & "Le répertoire qui doit contenir le fichier de licence est présent : " & CheminRepertoireLicenceSurProfilLocal)
			Else
				objFichierLog.WriteLine(VbTab & "Le répertoire qui doit contenir le fichier de licence n'existe pas : " & CheminRepertoireLicenceSurProfilLocal)
			End If

			If objFSO.FileExists(CheminFichierLicenceSurProfilLocal) Then
				objFichierLog.WriteLine(VbTab & "Le fichier est présent dans le profil local dans " & CheminFichierLicenceSurProfilLocal & " (à titre indicatif)")
			Else
				objFichierLog.WriteLine(VbTab & "Le fichier n'existe pas dans le profil local dans " & CheminFichierLicenceSurProfilLocal & " (à titre indicatif)")
			End If

			objFichierLog.WriteLine(VbTab & "Copie de " & CheminFichierLicenceSurHome & " sur " & CheminFichierLicenceSurProfilLocal)
			Err.clear
			On Error Resume Next
			Call objFSO.CopyFile (CheminFichierLicenceSurHome, CheminFichierLicenceSurProfilLocal, True)
			If Err.Number > 0 Then objFichierLog.WriteLine(VbTab & "Code de retour de l'erreur : " & err.number & " (" & err.description & ")")
			On error Goto 0

		Else
			objFichierLog.WriteLine(VbTab & "Le fichier n'est pas présent sur le HomeFolder, soit normalement dans " & CheminFichierLicenceSurHome)
		
			If objFSO.FileExists(CheminFichierLicenceSurProfilLocal) Then
				objFichierLog.WriteLine(VbTab & "Pour information, le fichier est présent dans le profil local dans " & CheminFichierLicenceSurProfilLocal & " (à titre indicatif)")
			Else
				objFichierLog.WriteLine(VbTab & "Pour information, le fichier n'existe pas dans le profil local dans " & CheminFichierLicenceSurProfilLocal & " (à titre indicatif)")
			End If

		End If
	
	End If

Else
	objFichierLog.WriteLine(VbTab & "HomeDrive " & vHomeDrive & " inaccessible. On arrête")
End If


'Call objFSO.CopyFile (CheminFichierSource, CheminFichierCible, True)

objFichierLog.WriteLine("Terminé")
'Wscript.echo "Exe terminé"

objFichierLog.Close 'Fermeture du fichier

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

Dans firefox, dans
about:config

passez à true le paramètre suivant

browser.xul.error_pages.expert_bad_cert
Lien vers le fichier : cliquez ici Copier le code

Dans firefox, dans
about:config

passez à true le paramètre suivant

L'article 1510 est vide.

2