theuntouchable
Goto Top

Überprüfen, ob User Reg schon vollständig geladen ist

Hallo Leute,

(Hab leider keinen passenden Unterpunkt für VBS gefunden)

wir haben eine Win 2008R2 Terminalserverlandschaft mit Citrix, bei der per GPO ein VBS auf den Servern ausgeführt wird, das für die Drucker zuständig ist. Dieses Skript vergleicht den Unterschied zwischen aktuell verbundenen Druckern und einer Textdatei, in der für jeden User seine jeweiligen Drucker stehen. Gibt es Unterschiede, löscht oder fügt es die jeweiligen Drucker hinzu.

Das Problem ist, das es anscheinend teilweise zu lange dauert, das Profil zu laden, und das Skript beim Auslesen der zugewiesen Drucker nichts zurück bekommt..

objFile1.Write Time & " - Liste im Profil verbundene Drucker auf.." & vbCrLf  
Set colPrinters = objWMIService.ExecQuery _
    ("Select * From Win32_Printer Where Local = FALSE")  
For Each objPrinter in colPrinters
	objFile1.Write "         " & objPrinter.Name & vbCrLf  
    strPrinterListA = strPrinterListA &  objPrinter.Name & vbCrLf
Next
objFile1.Write Time & " - ..abgeschlossen!" & vbCrLf & vbCrLf  

Jetzt versucht es natürlich, die Drucker zu verbinden, was dann aber in einem Fehler endet, da jetzt die Drucker doch plötzlich da sind.

objFile1.Write Time & " - Verbinde neu zugewiesene Drucker.." & vbCrLf  
Set objFile2 = objFS.OpenTextFile(strPrintersFile)
Do while not objFile2.AtEndOfStream
    strLine = objFile2.ReadLine  
    If InStr(strLine,strPattern)>0 Then
         strsplit=Split (strline, vbTab)
          For i = 0 to UBound(strsplit)
          Next      
          strPrinterSet = strsplit(1)
          strServerFQDN  = strsplit(2)
          strDefault = strsplit(3)
           strsplit2 = Split (strServerFQDN, ".")  
           strServer = strsplit2(0)
		  if strServer <> "ENTFERNT" Then  
           strUNC1 = "\\" & strServer & "\" & strPrinterSet  
            If strDefault = "cd"  Then  
             strDefaultPrinter = strUNC1
            End If
           If InStr(strPrinterListA,strUNC1) = 0 Then
            strNotConnected = strUNC1
            objFile1.Write "         " & strNotConnected & vbCrLf  
			Err.Clear()
            objNetwork.AddWindowsPrinterConnection strNotConnected
			IF Err.Number <> 0 then
             objFile1.Write "                  " & "Fehler " & Err.Number & " " & Err.Source & ": " & Err.Description & vbCrLf  
            End if 
           End If
		  End IF
    End If 
  Loop
objFile1.Write Time & " - ..abgeschlossen!" & vbCrLf & vbCrLf  

Hier ist ein Beispiel, was passiert, wenn die Reg nicht schnell genug geladen wird. Das Skript wartet jetzt eh schon 45 Sekunden..

User: -
Server: -
Datum: 03.06.2013
Zeit: 08:26:05

08:26:05 - Liste im Profil verbundene Drucker auf..
08:26:05 - ..abgeschlossen!

08:26:05 - Warte 45000 ms..
08:26:50 - abgeschlossen!

08:26:50 - Liste nochmals im Profil verbundene Drucker auf..
08:26:56 - ..abgeschlossen!

08:26:56 - Liste zugeordnete Drucker auf..
\\Server\Drucker1 (c)
\\Server\Drucker2 (cd)
\\Server\Drucker3 (c)
\\Server\Drucker4 (c)
\\Server\Drucker5 (c)
\\Server\Drucker6 (c)
08:26:56 - ..abgeschlossen!

08:26:56 - Lösche in Myprint nicht mehr zugeordnete Drucker..
08:26:56 - ..abgeschlossen!

08:26:56 - Verbinde neu zugewiesene Drucker..
\\Server\Drucker1
Fehler -2147021884 :
\\Server\Drucker2
Fehler -2147021884 :
\\Server\Drucker3
Fehler -2147021884 :
\\Server\Drucker4
Fehler -2147021884 :
\\Server\Drucker5
Fehler -2147021884 :
\\Server\Drucker6
Fehler -2147021884 :
08:26:56 - ..abgeschlossen!

08:26:56 - Setzte Standarddrucker..
\\Server\Drucker4
Fehler -2147352567 WSHNetwork.SetDefaultPrinter: Es ist kein Drucker mit dem Namen "\\Server\Drucker4" vorhanden.
08:26:56 - ..abgeschlossen!

08:26:56 - Liste nochmals im Profil verbundene Drucker auf..
08:26:57 - ..abgeschlossen!

Das Ganze geht eigentlich die meiste Zeit gut, aber es gibt eben auch Ausnahmen.

Jetzt meine Frage: Gibt es eine Möglichkeit, festzustellen, ob die Reg vollständig geladen ist?

Content-Key: 207365

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

Printed on: April 20, 2024 at 02:04 o'clock

Member: colinardo
colinardo Jun 03, 2013 updated at 11:10:35 (UTC)
Goto Top
Hi,
probier mal die Gruppenrichtlinie um Logon-Scripts "Synchron" auszuführen ausführen zu lassen:
Computereinstellungen/Administrative Vorlagen/System/Scripts/"Anmeldescripts gleichzeitig ausführen"
und das hier könnte auch noch helfen:
Computereinstellungen/Administrative Vorlagen/System/Anmelden/"Beim Neustart des Computers und bei der Anmeldung immer auf das Netzwerk warten.
Grüße Uwe
Member: TheUntouchable
TheUntouchable Jun 19, 2013 at 10:01:16 (UTC)
Goto Top
Hallo colinardo,

danke für deine Antwort!

Hat leider nichts gebracht.. Da Spielt wohl das Citrix Profil Managment noch mit rein..

Habe das Skript jetzt folgender maßen umgeschrieben:

Sub addPrinters()
	'Hinzufügen von Druckern die in Myprint aufgelistet sind aber nicht im   
	'aktuellen Profil  
	objFile1.Write Time & " - Verbinde in Myprint neu zugewiesene Drucker.." & vbCrLf  
	Set objFile2 = objFS.OpenTextFile(strMyPrintFile)
	Do while not objFile2.AtEndOfStream
		strLine = objFile2.ReadLine  
		If InStr(strLine,strPattern)>0 Then
			 strsplit=Split (strline, vbTab)
			  For i = 0 to UBound(strsplit)
			  Next      
			  strPrinterSet = strsplit(1)
			  strServerFQDN  = strsplit(2)
			  strDefault = strsplit(3)
			   strsplit2 = Split (strServerFQDN, ".")  
			   strServer = strsplit2(0)
			  if strServer <> "PRMHS014" Then  
			   strUNC1 = "\\" & strServer & "\" & strPrinterSet  
				If strDefault = "cd"  Then  
				 strDefaultPrinter = strUNC1
				End If
			   If InStr(strPrinterListA,strUNC1) = 0 Then
				strNotConnected = strUNC1
				objFile1.Write "         " & strNotConnected & vbCrLf  
				do
				 Err.Clear()
				 objNetwork.AddWindowsPrinterConnection strNotConnected
				 IF Err.Number <> 0 then
				  objFile1.Write "                  " & "Fehler " & Err.Number & " " & Err.Source & ": " & Err.Description & vbCrLf  
				  objFile1.Write "                  Warte " & intWaitAfterError & " ms auf die Registry und überprüfe ob Drucker schon vorhanden oder versuche es nochmals.." & vbCrLf  
				  wait intWaitAfterError,0
				  listProfilPrinters 1,0
				  If InStr(strPrinterListA,strUNC1)>0 Then
				   objFile1.Write "                  ..Drucker schon vorhanden!" & vbCrLf  
				   Err.Clear()
				  End If
				 End if
				objFile1.Write "DEBUG: Erste Loop Ende" & vbCrLf  
				Loop While Err.Number<>0
				objFile1.Write "          ..erfolgreich!" & vbCrLf  
			   End If
			  End IF
		End If 
	  Loop
	objFile1.Write Time & " - ..abgeschlossen!" & vbCrLf & vbCrLf  
End Sub

Das Skript wartet jetzt nach einem Fehler eine bestimmte Zeit, überprüft anschließend nochmals die Reg ob der Drucker jetzt vorhanden ist, bearbeitet den nächsten Drucker falls ja, oder startet einen neuen Verbindungsversuch falls nein.

Hat auch super geklappt beim Testen.. Jetzt stellte sich aber heraus, das wenn in der Zeile "objNetwork.AddWindowsPrinterConnection strNotConnected" ein Fehler auftritt, er komplett aus der Sub springt.. On Error Resume Next ist natürlich in der Datei enthalten..

Weiß wer weiter? face-sad
Member: colinardo
colinardo Jun 19, 2013 at 10:07:53 (UTC)
Goto Top
Bau mal das On Error Resume Next zusätzlich noch in die Sub addPrinter() mit ein nicht nur außerhalb der Prozedur.
Member: TheUntouchable
TheUntouchable Jun 19, 2013 at 10:50:22 (UTC)
Goto Top
Vielen Dank, das scheint das Problem gelöst zu haben! :D