julienmu
Goto Top

Vbs-Anmeldescript wird nicht ausgeführt

Hallo liebe Admins,

ich habe ein kleines Problem, bei dem ich nicht dahinter komme woran es ganu hackt.

Bei uns gab es im Vorfeld für alle Mitarbeiter ein altes Batch-Script, was über net use die entsprechenden Netzlaufwerke den Mitarbeitern zur Verfügung gestellt werden.

Ich habe jetzt ein neues Anmeldescript in vbs geschrieben und in den Profilen der AD den Pfad für das Anmeldescript entsprechend angepasst. Bei dem Server handelt es sich um einen Windows Server 2003, die komplette Verwaltung läuft nur über die AD, GPO's werden zz noch nicht verwendet.

Jetzt das Verhalten welches ich mir nicht erklären kann, das Skript wird beim Logon nicht ausgeführt, führt man es aber händisch an dem entsprechenden Arbeitsplatz aus, funktioniert es einwandfrei.
Nachdem das Skript einmal händisch auf dem Rechner ausgeführt wurde, greift es auch bei den folgenden Logons. Dieses Verhalten war replizierbar auf 9 von 10 Rechnern, auf einem Rechner wurde es direkt angenommen. Bei allen Rechnern handelt es sich um Windows 7 Pro N 64Bit. Der einzige Unterschied zwischen den Anmeldescripte sind unterschiedlich gemappte Laufwerke.

Zur Zusatzinfo:
Bei dem Skript werden Netzlaufwerke gelöscht und auf Basis eines Pings wird entschieden ob er nach der Namesauflösung mappt, wenn der Ping nicht erfolgreich ist, soll nach der IP gemappt werden.
Nach den Netzlaufwerken wird über WMI mehrere Abfragen zur Hardware abgefragt und die gesammelten Daten in einer Textdatei auf dem Server hinterlegt.

Die Frage:
Ist solch ein Verhalten bei jemanden bekannt, bzw. gibt es hierfür einen Lösungsansatz?

Schonmal danke für eure Mühen.

Viele Grüße
Julien

Content-Key: 290694

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

Printed on: April 26, 2024 at 17:04 o'clock

Member: julienmu
julienmu Dec 11, 2015 at 13:22:36 (UTC)
Goto Top
Das hier ist eines der Skripte
On Error Resume Next

Dim fso, WshNetwork, strComputer, objWMIService, colInstalledPrinters

strComputer = "."  
Set objWMIService = GetObject ("winmgmts:\\" & strComputer & "\root\cimv2")  
Set fso = CreateObject ("Scripting.FileSystemObject")  
Set WshNetwork = WScript.CreateObject ("WScript.Network")  

'Netzlaufwerke löschen  
Set shell = CreateObject("WScript.Shell")   
shell.run "net use * /d /y",0  

WScript.Sleep 700

'Funktion für Ping  
Function Ping(strHost)
	Dim objSh, strCommand, intWindowStyle, blnWaitOnReturn
 
	blnWaitOnReturn = False
	intWindowStyle = 0
	strCommand = "%ComSpec% /C %SystemRoot%\system32\ping.exe -n 1 " _  
	& strHost & " | " & "%SystemRoot%\system32\find.exe /i " _  
	& Chr(34) & "TTL=" & Chr(34)  
 
	Set objSh = WScript.CreateObject("WScript.Shell")  
	Ping = Not CBool(objSh.Run(strCommand, intWindowStyle, blnWaitOnReturn))
	Set objSh = Nothing
End Function

'Wenn Ping erfolgreich dann  
If Ping("nas-hp") Then  
	WshNetwork.MapNetworkDrive "I:", "\\NAS-HP\azubi", True  
	WshNetwork.MapNetworkDrive "J:", "\\HPSHARE\Genesis", True  
	WshNetwork.MapNetworkDrive "K:", "\\NAS-HP\Kunden", True  
	WshNetwork.MapNetworkDrive "L:", "\\NAS-HP\Technik", True  
	WshNetwork.MapNetworkDrive "O:", "\\NAS-HP\HP_Intern", True  
	WshNetwork.MapNetworkDrive "P:", "\\NAS-HP\Pool", True  
	WshNetwork.MapNetworkDrive "U:", "\\NAS-HP\Users\JM", True  
Else
'Wenn Ping NICHT erfolgreich dann  
	shell.Run "net use I: \\10.0.0.27\Azubi"  
	shell.Run "net use J: \\10.0.0.9\Genesis"  
	shell.Run "net use K: \\10.0.0.27\Kunden"  
	shell.Run "net use O: \\10.0.0.27\HP_Intern"  
	shell.Run "net use L: \\10.0.0.27\Technik"  
	shell.Run "net use P: \\10.0.0.27\Pool"  
	shell.Run "net use U: \\10.0.0.27\Users\JM"  
End If
 
Dim objFSO, objFolder, objShell, objTextFile, objFile
Dim strDirectory, strFile, strText, strName
Const ForWriting = 2
Const Create = True
Set objFSO = Wscript.CreateObject("Scripting.FileSystemObject")  

Const HKLM = &H80000002 'HKEY_LOCAL_MACHINE  

WScript.Sleep 1000

'Test  
strComputer = "."   
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")   
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_ComputerSystem",,48)   
For Each objItem in colItems 
    strName2 = objItem.Caption
Next

' Angemeldeter Benutzer  

strComputer = "."  

Set objWMIService = GetObject("winmgmts:" _  
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")   

Set colComputer = objWMIService.ExecQuery _
    ("Select * from Win32_ComputerSystem")  
 
For Each objComputer in colComputer
	strName = Mid(objComputer.UserName,InStr(objComputer.UserName,"\")+1,30)  
	
	Set objFile = objFSO.OpenTextFile("P:\Hardwareaufnahme\"&strName&"_"&strName2&".txt", ForWriting, Create)  
	objFile.WriteLine "-----------------------------------------------------------------------"  
    objFile.WriteLine "-----------------------------------------------------------------------"  
    objFile.WriteLine "Angemeldeter Benutzer:"  
    objFile.WriteLine objComputer.UserName
Next

'Letzter Login  

strComputer = "."  

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")  
Set colItems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")  

For Each objItem in colItems
    dtmLocalTime = objItem.LocalDateTime
    dtmMonth = Mid(dtmLocalTime, 5, 2)
    dtmDay = Mid(dtmLocalTime, 7, 2)
    dtmYear = Left(dtmLocalTime, 4)
    dtmHour = Mid(dtmLocalTime, 9, 2)
    dtmMinutes = Mid(dtmLocalTime, 11, 2)
    dtmSeconds = Mid(dtmLocalTime, 13, 2)
Next

Set Win32Computer = objWMIService.ExecQuery("SELECT * FROM Win32_ComputerSystem")   

For Each objItem In Win32Computer
   oGMT = (objItem.CurrentTimeZone / 60) 
   DaySave = objItem.DaylightInEffect 
Next
  objFile.WriteLine vbCr
  objFile.WriteLine "Letzter Login:"  
  objFile.WriteLine dtmDay & "." & dtmMonth & "." & dtmYear & " " & dtmHour & ":" & dtmMinutes  

'Abfrage Computername und Betriebssystem  
  objFile.WriteLine "-----------------------------------------------------------------------"  
  objFile.WriteLine "-----------------------------------------------------------------------"  
strComputer = "."  
Set objWMIService = GetObject("winmgmts:" _  
 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")  
Set colOSes = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")  
For Each objOS in colOSes
  objFile.WriteLine "Computer Name: "  
  objFile.WriteLine objOS.CSName
  objFile.WriteLine "-----------------------------------------------------------------------"  
  objFile.WriteLine "-----------------------------------------------------------------------"  
  objFile.WriteLine "Betriebssystem:"  
  objFile.WriteLine objOS.Caption & "- Service Pack " & objOS.ServicePackMajorVersion  
  objFile.WriteLine vbCr
  objFile.WriteLine "Architecktur:"  
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")  
Set colCSes = objWMIService.ExecQuery("SELECT * FROM Win32_ComputerSystem")  
For Each objCS In colCSes
  objFile.WriteLine objCS.SystemType
Next


' Hersteller und Modell  
  objFile.WriteLine "-----------------------------------------------------------------------"  
  objFile.WriteLine "-----------------------------------------------------------------------"  
  objFile.WriteLine "Herrsteller:"  
strComputer = "."  
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")  
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_ComputerSystem")  
For Each objItem In colItems
  objFile.WriteLine objItem.Manufacturer
  objFile.WriteLine vbCr
  objFile.WriteLine "Modell:"    
  objFile.WriteLine objItem.Model
Next

' IP Addresse  
  objFile.WriteLine "-----------------------------------------------------------------------"  
  objFile.WriteLine "-----------------------------------------------------------------------"  
  objFile.WriteLine "IP-Adresse:"  
strComputer = "."  
Set objWMIService = GetObject("winmgmts:" _  
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")  
Set IPConfigSet = objWMIService.ExecQuery _
    ("Select * from Win32_NetworkAdapterConfiguration Where IPEnabled=TRUE")  
For Each IPConfig in IPConfigSet
    If Not IsNull(IPConfig.IPAddress) Then 
        For i=LBound(IPConfig.IPAddress) to UBound(IPConfig.IPAddress)
        objFile.WriteLine IPConfig.IPAddress(i)
        Next
    End If
Next
'HARDWARE  
'Prozessor  
  objFile.WriteLine "-----------------------------------------------------------------------"  
  objFile.WriteLine "-----------------------------------------------------------------------"  
  objFile.WriteLine "Prozessor:"  
strComputer = "."  
Set colProcessors = objWMIService.ExecQuery("Select * from Win32_Processor")  
For Each objProcessor in colProcessors
  objFile.WriteLine objProcessor.Name
Next

'RAM  
  objFile.WriteLine vbCr
Dim objComputer, colComputer 
Dim strLogonUser, intRamMB

strComputer = "."  
Set objWMIService = GetObject("winmgmts:" _  
& "{impersonationLevel=impersonate}!\\" _   
& strComputer & "\root\cimv2")   
Set colComputer = objWMIService.ExecQuery _
("Select * from Win32_ComputerSystem")  

For Each objComputer in colComputer 
   intRamMB = int((objComputer.TotalPhysicalMemory) /1048576/1024)+1
   objFile.WriteLine "Arbeitspeicher: "  
   objFile.WriteLine intRamMB & " GB"  
Next

'Grafikkarte  
  objFile.WriteLine vbCr
strComputer = "."   
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")   
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_VideoController",,48)   
For Each objItem in colItems 
    objFile.WriteLine "Grafikkarte: "   
    objFile.WriteLine objItem.Caption
Next

'Festplatte  
objFile.WriteLine vbCr
strComputer = "."   
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")   
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_DiskDrive",,48)   
For Each objItem in colItems 
    objFile.WriteLine "Festplatte/n: "   
    objFile.WriteLine objItem.Caption
Next

'HDD Kapazität  
Dim intHDDgb

strComputer = "."   
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")   
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_DiskDrive",,48)   
For Each objItem in colItems 
   intHDDgb = int((objItem.Size) /1048576/1024)
   objFile.WriteLine "Kapazität: "  
   objFile.WriteLine intHDDgb & " GB"  
Next

'test  
Set objWMIService = GetObject("winmgmts:")  
Set objLogicalDisk = objWMIService.Get("Win32_LogicalDisk.DeviceID='c:'")  
For Each objItem in colItems 
  intFreeGB = Int ((objLogicalDisk.FreeSpace) /1048576/1024)

objFile.WriteLine "Freier Speicher in GB"  
objFile.WriteLine intFreeGB&" GB"  

'Installierte Software  
  objFile.WriteLine "-----------------------------------------------------------------------"  
  objFile.WriteLine "-----------------------------------------------------------------------"  
  objFile.WriteLine "Installierte Software:"  
  objFile.WriteLine vbCr
strComputer = "."  
Set objWMIService = GetObject("winmgmts:" _  
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")  
Set colSoftware = objWMIService.ExecQuery _
    ("Select * from Win32_Product")  
For Each objSoftware in colSoftware
  objFile.WriteLine objSoftware.Caption
Next
Next
Next
Mitglied: 122990
122990 Dec 11, 2015 updated at 16:26:08 (UTC)
Goto Top
Moin,
sehe ich das richtig, du hast das VBS in die Eigenschaft "Anmeldeskript" jedes Userobjektes eingetragen ? Das kann doch nicht funktionieren, hier laufen doch nur *.bat und *.cmd Skripte die im Netlogon liegen. (Sorry 2003 ist schon länger her ...)

Erstelle also eine vernünftige GPO und Weise das Skript als Anmeldeskript zu dann klappt das auch vernünftig, oder lass das VBS von eine *.cmd aus ausführen.
Und für ein Debugging deines Skriptes nehm das On Error Resume Next aus dem Skript raus und stell in dem GPOs ein das Skripte sichtbar ausgeführt werden, dann erhältst du auch eine vernünftige Fehlermeldung mit der du dein Skript Debuggen kannst sollte es Fehler auf bestimmten Clients aufweisen.

Btw. enthält dein Skript ziemlich viel redundante Zeilen die sich zusammenfassen lassen. Und in Zeile 12 mach noch ein Komma und ein True hinten dran dann erübrigt sich das nachfolgende Sleep, weil das Skript dann auf das Ende des Befehls wartet.
shell.run "net use * /d /y",0,True  

Gruß grexit
Member: julienmu
julienmu Dec 11, 2015 at 14:51:57 (UTC)
Goto Top
Zitat von @122990:

Moin,
sehe ich das richtig, du hast das VBS in die Eigenschaft "Anmeldeskript" jedes Userobjektes eingetragen ? Das kann doch nicht funktionieren, hier laufen doch nur *.bat und *.cmd Skripte die im Netlogon liegen.

Erstelle also eine vernünftige GPO und Weise das Skript als Anmeldeskript zu dann klappt das auch vernünftig, oder lass das VBS von eine *.cmd aus ausführen.
Und für ein Debugging deines Skriptes nehm das On Error Resume Next aus dem Skript raus und stell in dem GPOs ein das Skripte sichtbar ausgeführt werden, dann erhältst du auch eine vernünftige Fehlermeldung mit der du dein Skript Debuggen kannst sollte es Fehler auf bestimmten Clients aufweisen.

Btw. enthält dein Skript ziemlich viel redundante Zeilen die sich zusammenfassen lassen. Und in Zeile 12 mach noch ein Komma und ein True hinten dran dann erübrigt sich das nachfolgende Sleep, weil das Skript dann auf das Ende des Befehls wartet.
> shell.run "net use * /d /y",0,True  
> 
Gruß grexit

Huhu,

danke erstmal für die schnelle Rückantwort.

Da ich zZ noch Azubi bin entschuldoge ich mich schonmal im Vorfeld für die Unklarheiten meinerseits face-smile

Ja ich wollte das Skript jedes Userkonto der AD eintragen. Sollten dort aber neben den *.cmd und *.bat nicht auch Skripte laufen die über den Windows Script Host abgearbeitet werden? So zumindest wurde uns das beigebracht.

Vielen Dank für die Optimierung mit dem True, habe Sie sofort umgesetzt und das Sleep entfernt.

Zu den GPOs, leider ist mein Chef ein alter Hase, der seit Einführung von GPOs einen Bogen darum macht, mein Vorschlag, generell über die Gruppenrichtlinien zu verwalten wurde aufgeschoben bis wir den DC vom 2003 auf einen neuen 2012 umgezogen haben face-sad

Das Skript an sich ist noch nicht ganz fertig, die redundanten Stellen werde ich noch entfernen und alle Deklarationen an den Anfang setzten, die Redundanten Zeilen sollten aber doch eigentlich keine Auswirkungen auf die Funktionalität des Skriptes haben, oder?

Grüße
Julien
Mitglied: 122990
122990 Dec 11, 2015 updated at 16:34:13 (UTC)
Goto Top
Zitat von @julienmu:
Ja ich wollte das Skript jedes Userkonto der AD eintragen. Sollten dort aber neben den *.cmd und *.bat nicht auch Skripte laufen die über den Windows Script Host abgearbeitet werden? So zumindest wurde uns das beigebracht.
Jup stimmt, sorry, ist schon zu lange her der 2003er ... Die Skripte liegen aber schon auf dem Netlogon Share und es wurde nur der Name des Skripts eingetragen ? SystemRoot\SYSVOL\Sysvol\Domänenname\Scripts
Das Skript an sich ist noch nicht ganz fertig, die redundanten Stellen werde ich noch entfernen und alle Deklarationen an den Anfang setzten, die Redundanten Zeilen sollten aber doch eigentlich keine Auswirkungen auf die Funktionalität des Skriptes haben, oder?
Nein das nicht.
Aber wie geschrieben nimm das On Error Resume Next mal testweise raus dann bekommst du zumindest eine Fehlermeldung wenn es auf einem Client nicht läuft und du bekommst einen Hinweis welche Codestelle dem Client Probleme bereitet.