Ce script en vbs permet de modifier le nom enregistré dans office par le nom de login windows de l'utilisateur. Cela permet par exemple de savoir qui utilise réellement un fichier sur un serveur de données et de le libérer au lieu d'un nom générique souvent utilisé pour installer office.
Il fait :
-la vérification de la version office installée
-la supresssion et modification de la clef registre "HKCU\Software\Microsoft\Office\x.0\Common\UserInfo\UserName"
-la trace des modifications effectuées dans le fichier office.log situé sous \\serveur\partage ou \racine\fichier (à modifier dans le code)
Merci aux membres des forums qui m'ont aidés pour les fonctions de conversion ascii vers binaire. Il manque certainement une fonction pour tracer les erreurs mais je débute..
Source / Exemple :
'office.vbs version 2.00
'
'script de modification du nom enregistré dans office par le nom de login windows de l'utilisateur
'Vérification de la version office installée
'modification par supresssion et modification de la clef registre "HKCU\Software\Microsoft\Office\x.0\Common\UserInfo\UserName"
'traces des modifications effectuées dans le fichier office.log situé sous \\serveur\partage
On error resume next
'déclaration des variables
Dim wscr, WshShell, tempread, key, valhex
Dim refRegistry, arrValueData, strValueData, strSKPath, strValueName, i
Dim oFSys, Filelog
Dim sResult, sNomOffice, sOfficeVer, sVersionOffice
'déclaration des objets
Set wscr = CreateObject("wscript.shell")
Set netw = CreateObject("WScript.Network")
Set objWord = CreateObject("Word.Application")
Set oFSys = CreateObject("Scripting.FileSystemObject")
Set WshShell = WScript.CreateObject("WScript.Shell")
'déclaration constante
Const HKEY_CURRENT_USER = &H80000001
Const strComputer = "."
sRegHKCU="HKCU\"
sregHKLM="HKLM\"
sRegCommun="SOFTWARE\Microsoft\Office\"
sregPost1="\Common\UserInfo"
sRegPost = "\Common\InstallRoot\"
strValueName = "UserName"
'HKLM\SOFTWARE\Microsoft\Office\11.0\Common\InstallRoot ' Office 2003
'HKLM\SOFTWARE\Microsoft\Office\10.0\Common\InstallRoot ' Office 2002 (XP)
'HKLM\SOFTWARE\Microsoft\Office\9.0\Common\InstallRoot ' Office 2000
'HKLM\SOFTWARE\Microsoft\Office\8.0\Common\InstallRoot ' Office 97
Function GetOfficeVer()
Select Case True
Case RegKeyExists(sRegPre & "11.0" & sRegPost)
sOfficeVer = "11.0"
sVersionOffice = "Office 2003"
Case RegKeyExists(sRegPre & "10.0" & sRegPost)
sOfficeVer = "10.0"
sVersionOffice = "Office 2002"
Case RegKeyExists(sRegPre & "9.0" & sRegPost)
sOfficeVer = "9.0"
sVersionOffice = "Office 2000"
Case RegKeyExists(sRegPre & "8.0" & sRegPost)
sOfficeVer = "8.0"
sVersionOffice = "Office 97"
Case Else
sOfficeVer = "pas d'office"
sVersionOffice = "pas d'office"
End Select
GetOfficeVer= sOfficeVer
End Function
Function RegKeyExists(ByVal sRegKey)
' Returns True or False based on the existence of a registry key.
Dim sDescription, oShell
Set oShell = CreateObject("WScript.Shell")
RegKeyExists = True
sRegKey = Trim (sRegKey)
If Not Right(sRegKey, 1) = "\" Then
sRegKey = sRegKey & "\"
End If
On Error Resume Next
oShell.RegRead "HKEYNotAKey\"
sDescription = Replace(Err.Description, "HKEYNotAKey\", "")
Err.Clear
oShell.RegRead sRegKey
RegKeyExists = sDescription <> Replace(Err.Description, sRegKey, "")
On Error Goto 0
End Function
'declaration des chaines clef de registre
sRegPre = sregHKLM & sRegCommun ' "HKLM\SOFTWARE\Microsoft\Office\"
strSKPath = sRegCommun & GetOfficeVer & sregPost1 '"Software\Microsoft\Office\9.0\Common\UserInfo"
key = sRegHKCU & strSKPath & "\" & strValueName '"HKCU\Software\Microsoft\Office\9.0\Common\UserInfo\UserName"
'Lecture des données utilisateur et test d'égalité pour ne pas faire de modification si username =user office
Sub LoginUtilisateur
'WScript.Echo "Version office installée : " & sOfficeVer
sNomOffice = objWord.UserName
If netw.UserName=objWord.UserName Then Call Fichier
End Sub
'Transformation du nom login utilisateur en chaine hexa pour la clef office
Sub ASCIIHEXA
Dim aAscii()
Dim aChaine()
Dim iLenChaine
Dim k
Dim aHexa()
sChaine = netw.UserName
sResult = ""
' taille
iLenChaine = Len(sChaine)
' la chaine en tableau
ReDim aChaine(iLenChaine) 'premiere valeur null non utilisée... indice 0
For k = 1 To iLenChaine
aChaine(k) = Mid(sChaine, k, 1)
Next
' ascii integer en tableau
ReDim aAscii(iLenChaine)
For k = 1 To iLenChaine
aAscii(k) = Asc(aChaine(k))
Next
' ascii hexa en tableau + result
ReDim aHexa(iLenChaine)
For k = 1 To iLenChaine
aHexa(k) = Hex(aAscii(k))
sResult = sResult & CStr(aHexa(k)) & "-00-"
Next
' on ajoute le dernier chr(0)
sResult = sResult & "00-00"
End Sub
'Lecture de la clef de registre pour user office
Sub lecture
Set refRegistry = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")
If refRegistry.GetBinaryValue(HKEY_CURRENT_USER, strSKPath , strValueName, arrValueData) = 0 Then
For i = LBound(arrValueData) to UBound (arrValueData)
strValueData = strValueData & Right("00" & Hex(arrValueData(i)),2) & "-"
Next
strValueData = Left(strValueData, Len(strValueData) - 1)
Else
Call Fichier
End If
Set refRegistry = Nothing
End Sub
'Ecriture base de registre et fichier log
Sub Fichier
'cas egalité username et user office
If netw.UserName=objWord.UserName Then
Set FileLog = oFSys.OpenTextFile("c:\office.log", 8, True)
FileLog.writeLine ("PC :" & netw.ComputerName & " Nom utilisateur :" & netw.UserName & " Nom office :" & objWord.UserName & " Compte Identique" & "; Version office : " & sVersionOffice)
FileLog.close
Exit Sub
End If
'cas différence username et user office
If netw.UserName <> objWord.UserName Then
WshShell.RegDelete key
Dim refRegistry, arrValueData, strValueData, l, k
ReDim arrValueData(Len(sResult)* 2 + 1)
k = 0
For l = 1 To Len(sResult)
arrValueData(k) = Asc(Mid(sResult,l,1))
k = k + 1
arrValueData(k) = 0
k = k + 1
Next
arrValueData(k) = 0
k = k + 1
arrValueData(k) = 0
Set refRegistry = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")
refRegistry.SetBinaryValue HKCU, strSKPath, strValueName, arrValueData
Set refRegistry = Nothing
'Ecriture fichier log sur c:\
Set FileLog = oFSys.OpenTextFile("c:\office.log", 8, True)
FileLog.writeLine ("PC :" & netw.ComputerName & " Nom utilisateur :" & netw.UserName & " Nom office :" & sNomOffice & " Modification effectuée" & "; Version office : " & sVersionOffice)
FileLog.close
Set netw = Nothing
Set objWord =Nothing
Set oFSys = Nothing
Set WshShell = Nothing
Set FileLog= Nothing
End If
End Sub
'procédure principale
LoginUtilisateur
ASCIIHEXA
Lecture
Fichier