mschaedler1982
Goto Top

Anmeldeskript in VB

Hallo zusammen.

Ich habe hier ein aktuelles VB Skript was bei uns zur Anmeldung verwendet wird. Am Ende des Skripts werden diverse Notes speziefische Dateien in das P Laufwerk des Users kopiert.
Das Skript würde ich gerne um eine Kopier Funktion erweitern.

In unregelmäßigen Abständen wird eine Datei ersetzt die vom Server (UNC Pfad) auf den Client kopiert wird.

Quellpfad: \\SERVER_XY\VERZEICHNIS\ORDNER\DATEI.DLL
Zielpfad C:\Program Files (x86)\procad\profile\dbanw\Assembly\DATEI.DLL

Hat mir hierzu jemand den passenden Code?

Vielen Dank schonmal!


' Zentrales Loginscript zum Mappen der Netzlaufwerke über die Gruppenzugehörigkeit  
'  
' Stand XY  
' EDV-Abteilung    
' Update: Abfrage des Flagfiles    


	Dim IWshShell3, WshNet, oExec, Dir, driveletter1, driveletter2, driveletter3, driveletter4, driveletter5,driveletter6,driveletter7,driveletter8


	Dim share1, share2, share3 ,share4 ,share5, share6,share7,share8,folder

	driveletter1 = "R:"  
	driveletter2 = "J:"  
	driveletter3 = "X:"  
	driveletter4 = "Q:"  
	driveletter5 = "T:"  
	driveletter6 = "K:"  
	driveletter7 = "M:"  
	driveletter8 = "S:"  
	

	share1 = "\\Server1\share1"  
	share2 = "\\Server2\share2"  
	share3 = "\\Server3\share3"  
	share4 = "\\Server4\share4"  
	share5 = "\\Server5\share5"  
	share6 = "\\Server6\share6"  
	share7 = "\\Server7\share7"  
	share8 = "\\Server\share8"  
	

   	'Im Fehlerfall zur nächsten Zeile gehen  
	On Error Resume Next


	Set IFileSystem = CreateObject("Scripting.FilesystemObject")  

	Set IFileSystem1 = CreateObject("Scripting.FilesystemObject")  

	Set IWshShell3 = CreateObject("WScript.Shell")  

	Set WshNet = WScript.CreateObject("WScript.Network")  
	 
	'Falls Anmeldung auf Terminalserver dann vorzeitiges Beenden des Loginscripts da bei neuer Farm Preferences benutzt werden  
		
	 If IFileSystem.FileExists("C:\windows\scripts\ts.txt") then WScript.Quit  
		
	
	Set oExec = IWshShell3.Exec("\\SERVER_XY\NETLOGON\IFMEMBER.exe /l")  

	'Im Fehlerfall zur nächsten Zeile gehen  
	'On Error Resume Next  
	


	Do while oExec.Status=0
		Dir = Dir & oExec.StdOut.ReadAll
	Loop




	'R-Laufwerk mappen  
	If InStr(Dir,"GRUPPE5") then  
			WshNet.MapNetworkDrive driveletter1, share1
			If err.number <>0 then
				'MsgBox "Laufwerk konnte nicht verbunden werden!" & err.Description  
			End If
	End If

	'J-Laufwerk mappen  
	If InStr(Dir,"GRUPPE6") then  
			WshNet.MapNetworkDrive driveletter2, share2
			If err.number <>0 then
				'MsgBox "Laufwerk konnte nicht verbunden werden!" & err.Description  
			End If
	End If

	'X-Laufwerk mappen  
	If InStr(Dir,"GRUPPE1") then  
			WshNet.MapNetworkDrive driveletter3, share3
			If err.number <>0 then
				'MsgBox "Laufwerk konnte nicht verbunden werden!" & err.Description  
			End If
	End If

	'Q-Laufwerk mappen  
	If InStr(Dir,"GRUPPE7") then  
			WshNet.MapNetworkDrive driveletter4, share4
			If err.number <>0 then
				'MsgBox "Laufwerk konnte nicht verbunden werden!" & err.Description  
			End If
	End If

	'T-Laufwerk mappen  
	If InStr(Dir,"GRUPPE2") then  
			WshNet.MapNetworkDrive driveletter5, share5
			If err.number <>0 then
				'MsgBox "Laufwerk konnte nicht verbunden werden!" & err.Description  
			End If
	End If

	'K-Laufwerk mappen  
	If InStr(Dir,"GRUPPE3") then  
			WshNet.MapNetworkDrive driveletter6, share6
			If err.number <>0 then
				'MsgBox "Laufwerk konnte nicht verbunden werden!" & err.Description  
			End If
	End If

	'M-Laufwerk mappen  
	If InStr(Dir,"GRUPPE4") or InStr(Dir,"vredenu.lg.pictures_l") then  


	   		'WshNet.RemoveNetworkDrive driveletter7,true,true  
	   		WshNet.MapNetworkDrive driveletter7, share7



	End If

	'S-Laufwerk mappen( KOM-Archiv )  
	If InStr(Dir,"GRUPPE5") then  
			WshNet.MapNetworkDrive driveletter8, share8
			If err.number <>0 then
				'MsgBox "Laufwerk konnte nicht verbunden werden!" & err.Description  
			End If
	End If

  






'Notesdaten am Freitag sichern  
if weekday(date) = 6 then

	On Error Resume next

	'Falls kein Thinclient  
	If not IFileSystem.FileExists("C:\windows\ts.txt")then  
		'Ordner erstellen  
		If not IFileSystem.FolderExists("P:\NotesEDV")then  
			IFileSystem.CreateFolder "P:\NotesEDV"  
		end if
		'Backup auf P:\NotesEDV  
		IFileSystem.CopyFile "C:\Notes\Data\*.id","P:\NotesEDV\",true  
		IFileSystem.CopyFile "C:\Notes\Data\names.nsf","P:\NotesEDV\",true  
		IFileSystem.CopyFile "C:\Notes\Data\bookmark.nsf","P:\NotesEDV\",true  
		IFileSystem.CopyFile "C:\Notes\Data\desktop*.*","P:\NotesEDV\",true  
		IFileSystem.CopyFile "C:\Notes\notes.ini","P:\NotesEDV\",true  
		'Cache.ndk löschen für Fatclients  

		If IFileSystem.FileExists("C:\Notes\data\cache.ndk")then  
			IFileSystem.DeleteFile "C:\Notes\data\cache.ndk",true  
		end if

	'ID's kopieren falls Fatclient && ICA-ClientUser sowie erstellungsdatumsabhängig  
		If IFileSystem.FolderExists("P:\TSNotes\de\data")then  

			Set folder = IFileSystem.GetFolder("C:\Notes\Data")  

			Set file = folder.Files

			For Each item In file

	  			if IFileSystem.getextensionname(item.Name) = "id" then  
				'Nur ID-File kopieren falls Erstellungsdatum auf C jünger ist als das auf P  
					help = "P:\TSNotes\de\Data\" & item.Name  
					'msgbox help  

					Set Pdrivedat = IFileSystem1.getfile(help)
	  				if item.DateLastModified > Pdrivedat.DateLastModified then
	  					IFileSystem.CopyFile item,"P:\TSNotes\de\data\",true  

	  				end if

	  			end if

			Next

	    end if

	end if

'Cache.ndk für Thinclients löschen  
	If IFileSystem.FileExists("P:\TSNotes\de\data\cache.ndk")then  
		IFileSystem.DeleteFile "P:\TSNotes\de\data\cache.ndk",true  
	end if


end if
    	'allokierten Speicher der Objekte freigeben  
    	Set WshNet = nothing
	Set IWshShell3 = nothing
	Set IFileSystem = nothing 

Content-Key: 242071

Url: https://administrator.de/contentid/242071

Printed on: April 24, 2024 at 23:04 o'clock

Member: colinardo
colinardo Jun 27, 2014 updated at 12:37:02 (UTC)
Goto Top
Moin,
in unregelmäßigen Abständen wird eine Datei ersetzt die vom Server (UNC Pfad) auf den Client kopiert wird.
definiere unregelmäßig ?
ansonsten so
if IFileSystem.FileExists("\\SERVER_XY\VERZEICHNIS\ORDNER\DATEI.DLL") then  
    IFileSystem.CopyFile "\\SERVER_XY\VERZEICHNIS\ORDNER\DATEI.DLL", "C:\Program Files (x86)\procad\profile\dbanw\Assembly\", true  
end if
Grüße Uwe

p.s. bitte überprüfe ob du in deinem Code-Post nicht zu viel aus deiner Firma preis gibst. Wir hatten hier schon Fälle da ließ ein User alle seine Beiträge löschen weil er einfach zu viel preisgegeben hat ! Merci.
Member: mschaedler1982
mschaedler1982 Jun 27, 2014 at 12:38:45 (UTC)
Goto Top
Unregelmäßig heißt für mich 1 mal im Quartal. Gibt es noch eine bessere Variante?
Member: colinardo
colinardo Jun 27, 2014 updated at 12:45:49 (UTC)
Goto Top
Zitat von @mschaedler1982:
Gibt es noch eine bessere Variante?
was meinst du mit besser ??? was funktioniert denn nicht ?
Member: mschaedler1982
mschaedler1982 Jun 27, 2014 at 12:54:56 (UTC)
Goto Top
Ich habe den Code überarbeitet, die Gruppennamen sind und verallgemeinert. Danke für den Hinweis!

Ja ich mein. Es gibt ja zig möglichkeiten um Dateien zu kopieren. Nun bei dem Anmeldeskript wird jedesmal die Datei kopiert ohne das sie wirklich erneurt wurde.
Berücksichtigen müsste man auch noch ob Windows 7 32 / 64 Bit und Windows XP 32 / 64 Bit vorhanden ist. Kann man auch eine Prüfroutine einbauen die quasi die Version oder das Datum der Datei prüft und nur wenn es eine neuere Datei ist den Kopiervorgang startet?
Member: colinardo
colinardo Jun 27, 2014 updated at 13:22:32 (UTC)
Goto Top
das könnte dann insgesamt so aussehen:
Dim strPathLocal, strFileRemote, f_remote, f_local, fso, objShell
Set fso = CreateObject("Scripting.Filesystemobject")  
Set objShell = CreateObject("Wscript.Shell")  

'RemoteFile  
strFileRemote = "\\SERVER_XY\VERZEICHNIS\ORDNER\DATEI.DLL"  

'je nach OS-Bitnes den lokalen Pfad setzen  
If is64Bit() Then
	strPathLocal = objShell.ExpandEnvironmentStrings("%programfiles(x86)%") & "\procad\profile\dbanw\Assembly\"	  
Else
	strPathLocal = objShell.ExpandEnvironmentStrings("%programfiles%") & "\procad\profile\dbanw\Assembly\"  
End If

' nur wenn beide Dateien existieren ...  
If fso.FileExists(strFileRemote) And fso.FileExists(strPathLocal & fso.GetFileName(strFileRemote)) Then
	'Dateireferenzen holen  
	Set f_remote = fso.GetFile(strFileRemote)
	Set f_local = fso.GetFile(strPathLocal & fso.GetFileName(strFileRemote))
	
	'Dateien vergleichen und nur kopieren wenn Remote-Datei neuer ist  
	If f_remote.DateLastModified > f_local.DateLastModified Then
		fso.CopyFile strFileRemote, strPathLocal, True		
	End If
End If

'Funktion zum überprüfen ob 64bit  
Function is64Bit()
	Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")  
	Set colItems = objWMIService.ExecQuery("Select OSArchitecture from Win32_OperatingSystem")  
	For Each objItem in colItems
		If LCase(objItem.OSArchitecture) = "64-bit" Then  
			is64Bit = True
		Else
			is64Bit = False
		End If 
	Next
End Function
-edit- noch was korrigiert
Member: manuel-r
manuel-r Jun 27, 2014 at 13:25:31 (UTC)
Goto Top
bei dem Anmeldeskript wird jedesmal die Datei kopiert ohne das sie wirklich erneurt wurde.

Das kann man auch mit VBScript realisieren. In der Praxis ist mir das regelmäßig zu aufwändig das Dateidatum gegeneinander zu prüfen. Ich helfe mir dann immer mit einen run indem ich damit ein ganz normales xcopy mit der Option /d aufrufe. Ist zwar quick&dirty aber es erfüllt seinen Zweck.

Berücksichtigen müsste man auch noch ob Windows 7 32 / 64 Bit und Windows XP 32 / 64 Bit vorhanden ist.
Die Prozessorarchitektur kannst du ermitteln indem du mit deinem Script auf die Systemvariable %PROCESSOR_ARCHITECTURE% prüfst. Bei AMD64 hast du 64Bit und bei x86 32Bit. An die OS-Version kommst du mit Win32_OperatingSystem.Version; an das Servicepack mit Win32_OperatingSystem.ServicePackMajorVersion.

Manuel
Member: mschaedler1982
mschaedler1982 Jul 02, 2014 at 11:20:35 (UTC)
Goto Top
Funktioniert! Einwandfrei!! Danke!!!