TUTOS.EU

Renommer les imprimantes en vbs

Comment renommer les imprimantes en vbs

Renomme les files d'impressions. Par exemple ceci :
Microsoft XPS Document Writer (de Bob) dans la session 2

sera renommé en
Microsoft XPS Document Writer_Bob

Ce script ne DOIT PAS être exécuté par un administrateur car ce dernier verra toutes les files d'impression de tous les utilisateurs et du coup il les renommera toutes.

Notez que pour Citrix en XenApp 7, ce script n'a plus d'intérêt avec le CTX142160
http://support.citrix.com/article/CTX142160

Dim WSHShell
Dim vUserName, varNewName

Set WSHShell = CreateObject("WScript.Shell")

vUserName = WSHShell.ExpandEnvironmentStrings("%USERNAME%")
'Wscript.Echo "vUserName : " & vUserName

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Printer",,48) 
For Each objItem in colItems 
    'Wscript.Echo "-----------------------------------"
    'Wscript.Echo "Win32_Printer instance"
    'Wscript.Echo "-----------------------------------"
	varName = objItem.Name
    'Wscript.Echo "Name: " & varName
	
	'MyPos = InStr (Lcase(varName), lcase(vUserName))
	'If MyPos > 0 Then
	
	'End If

	MyPos = InStr (Lcase(varName), "(")
	If MyPos > 0 Then
		varNewName = Left(varName, MyPos-1)
		varNewName = varNewName & "_" & vUserName
		'Wscript.Echo "Renomage en " & varNewName
		intResult = objItem.RenamePrinter(varNewName)
		Select case intResult
			'Case 0 : WScript.Echo "Success"
			'Case 5 : WScript.Echo "Access denied"
			'Case 1801 : WScript.Echo "Invalid printer name"
		End Select		
		'exit for		
	End If

Next
Lien vers le fichier : cliquez ici Copier le code

La version ci-dessous reprend le même principe avec des fonctionnalités en plus :
Création d'un fichier de log
plusieurs passage pour éviter qu'une file d'impression ne soit pas traitée car elle a mis du temps à monter

Dim WSHShell
Dim vUserName, varNewName

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

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

Const CstLogger = 1


Set WSHShell = CreateObject("WScript.Shell")
vUserName = WSHShell.ExpandEnvironmentStrings("%USERNAME%") 'Pour le login du user

ScriptFileName = wscript.scriptname
Position = InstrRev(ScriptFileName,".")
if (Position > 0) Then ScriptFileName = Left(ScriptFileName, Position - 1)

NomFichier = ScriptFileName & "_" & vUserName & "_Log.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 CstLogger = 1 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
End If

'Wscript.Echo "vUserName : " & vUserName
strComputer = "." 

WScript.Sleep(8000)
If CstLogger = 1 Then objTextFile.WriteLine(Now & "Debut du premier passage")
Call subRenamePrinters
If CstLogger = 1 Then objTextFile.WriteLine(Now & "Fin du premier passage")

WScript.Sleep(20000)
If CstLogger = 1 Then objTextFile.WriteLine(Now & "Debut du second passage")
Call subRenamePrinters
If CstLogger = 1 Then objTextFile.WriteLine(Now & "Fin du second passage")

WScript.Sleep(60000)
If CstLogger = 1 Then objTextFile.WriteLine(Now & "Debut du troisieme passage")
Call subRenamePrinters
If CstLogger = 1 Then objTextFile.WriteLine(Now & "Fin du troisieme passage")

Sub subRenamePrinters()

	Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
	Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Printer",,48) 
	For Each objItem in colItems 
		'Wscript.Echo "-----------------------------------"
		'Wscript.Echo "Win32_Printer instance"
		'Wscript.Echo "-----------------------------------"
		varName = objItem.Name
		'Wscript.Echo "Name: " & varName
		
		'MyPos = InStr (Lcase(varName), lcase(vUserName))
		'If MyPos > 0 Then 'Si la file d'impression contient le login du user
		
		'End If

		
		MyPos = InStr (Lcase(varName), "(")
		If MyPos > 0 Then 'Si la file d'impression contient une (
			If CstLogger = 1 Then objTextFile.WriteLine(varName) 'Nom de l'imprimante regardée
			varNewName = Left(varName, MyPos-1)
			varNewName = Trim(varNewName) & "_" & vUserName
			'Wscript.Echo "Renomage en " & varNewName
			If CstLogger = 1 Then objTextFile.WriteLine("Renommage en " & varNewName) 'Nom de l'imprimante regardée
			intResult = objItem.RenamePrinter(varNewName)
			Select case intResult
				'Case 0 : WScript.Echo "Success"
				'Case 5 : WScript.Echo "Access denied"
				'Case 1801 : WScript.Echo "Invalid printer name"
			End Select		
			'exit for		
		End If
		
	Next
	Set colItems = Nothing
	Set objWMIService = Nothing

End Sub


Set WSHShell = Nothing

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

	Set objTextFile = Nothing
	Set objFSO = Nothing
End If
Lien vers le fichier : cliquez ici Copier le code

La version ci-dessous ajoute, avant renommage, l'effacement d'une précédent file d'impression qui porte le même nom que celui qui est voulu

Dim WSHShell
Dim vUserName, varNewName, varResultat

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

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

Const CstLogger = 1


Set WSHShell = CreateObject("WScript.Shell")
vUserName = WSHShell.ExpandEnvironmentStrings("%USERNAME%") 'Pour le login du user

ScriptFileName = wscript.scriptname
Position = InstrRev(ScriptFileName,".")
if (Position > 0) Then ScriptFileName = Left(ScriptFileName, Position - 1)

NomFichier = ScriptFileName & "_" & vUserName & "_Log.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 CstLogger = 1 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
End If

'Wscript.Echo "vUserName : " & vUserName
strComputer = "." 

WScript.Sleep(8000)
If CstLogger = 1 Then objTextFile.WriteLine(Now & "Debut du premier passage")
Call subRenamePrinters
If CstLogger = 1 Then objTextFile.WriteLine(Now & "Fin du premier passage")

WScript.Sleep(20000)
If CstLogger = 1 Then objTextFile.WriteLine(Now & "Debut du second passage")
Call subRenamePrinters
If CstLogger = 1 Then objTextFile.WriteLine(Now & "Fin du second passage")

WScript.Sleep(60000)
If CstLogger = 1 Then objTextFile.WriteLine(Now & "Debut du troisieme passage")
Call subRenamePrinters
If CstLogger = 1 Then objTextFile.WriteLine(Now & "Fin du troisieme passage")

Sub subRenamePrinters()

	Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
	Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Printer",,48) 
	For Each objItem in colItems 
		'Wscript.Echo "-----------------------------------"
		'Wscript.Echo "Win32_Printer instance"
		'Wscript.Echo "-----------------------------------"
		varName = objItem.Name
		'Wscript.Echo "Name: " & varName
		If CstLogger = 1 Then objTextFile.WriteLine(varName) 'Nom de l'imprimante regardée

		
	'FindPrinterAndDelete

		'Determination du nom cible
		MyPos = InStr (Lcase(varName), "(")
		If MyPos > 0 Then 'Si la file d'impression contient une (
			varNewName = Left(varName, MyPos-1)
			varNewName = Trim(varNewName) & "_" & vUserName
			
			If Lcase(varName) <> Lcase(varNewName) Then 'Si la file d'impression doit être renommée
				'Wscript.Echo "Renomage en " & varNewName
				If CstLogger = 1 Then objTextFile.WriteLine("La file d'impression doit être renommée en " & varNewName) 'Nom de l'imprimante regardée
				If CstLogger = 1 Then objTextFile.WriteLine("Effacement eventuel d une precedente file : ") 'Nom de l'imprimante regardée
				varResultat = FindPrinterAndDelete(varNewName)
				If (CstLogger = 1) And (varResultat = 0) Then objTextFile.WriteLine("Pas d effacement d une precedente file nommee " & varNewName) 'Nom de l'imprimante regardée
				If (CstLogger = 1) And (varResultat = 1) Then objTextFile.WriteLine("Une precedente file d impression nommee " & varNewName & " a ete effacee") 'Nom de l'imprimante regardée
				
				If CstLogger = 1 Then objTextFile.WriteLine("Renommage de " & varName & " en " & varNewName)
				intResult = objItem.RenamePrinter(varNewName)
				Select case intResult
					'Case 0 : WScript.Echo "Success"
					'Case 5 : WScript.Echo "Access denied"
					'Case 1801 : WScript.Echo "Invalid printer name"
				End Select		
				'exit for			
			End If

		End If
		
	Next
	Set colItems = Nothing
	Set objWMIService = Nothing

End Sub

Function FindPrinterAndDelete(ByVal varNomPrinter)

	Dim varTrouve
	Dim objWMIServiceforDelete, colItemsforDelete
	
	varTrouve = 0

	Set objWMIServiceforDelete = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
	Set colItemsforDelete = objWMIServiceforDelete.ExecQuery("SELECT * FROM Win32_Printer where Name = '" & varNomPrinter & "'",,48) 
	For Each objItem in colItemsforDelete 
		varTrouve = 1
		objItem.Delete_ 'Effacement de la file d'impression
		Exit For
	Next

	FindPrinter = varTrouve

End Function

Set WSHShell = Nothing

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

	Set objTextFile = Nothing
	Set objFSO = Nothing
End If
Lien vers le fichier : cliquez ici Copier le code

Pages Web

Site WebDescription
Blog.cloud-client.infoTip: Getting legacy printer names back in XenApp 7.5
Citrix CTX142160This fix reinstates the "Legacy printer names" policy, which was not previously available in Version 7.x of the product.

2