Slupor 10 Geschrieben 19. Dezember 2013 Melden Teilen Geschrieben 19. Dezember 2013 (bearbeitet) Hallo, Ich stehe hier vor folgendem Problem: In unserer Firma arbeiten 180 Mitarbeiter am PC. Bisher sind diese auf 10 Mandanten verteilt und jeder Mandant hat sein eigenes Anmeldescript, welches beim Benutzer eingetragen ist. Folgendes Fallbeispiel: Für Mandant 1 werden standartmäßig Laufwerk Z und Q verbunden (wohin ist ja eingentlich egal). 4 von 10 Mitarbeitern müssen aber zusätzlich Laufwerk G haben. Für diese Mitarbeiter ist ein zusätzliches script mit Namen "%username%.cmd" erstellt worden, welches über "if exist "\\DC1\NETLOGON\%username%.cmd" call "\\DC1\NETLOGON\%username%.cmd"" aufgerufen wird. Nun ändern sich hier die Berechtigungen aber ständig und bei den Scripten existiert mehr und mehr ein Totales durcheinander. Mein AD sieht in etwa wie folgt aus: -Domäne - Mandant 1 - User1.1 - User1.2 - Mandant 2 -User2.1 -User2.2 . . . Ich möchte nun mit so wenig Scripten wie möglich eine Lösung finden und habe mir folgendes überlegt: 1.: weg mit den Batch-Scripten --> Umstellung auf VBS 2.: Kein Script mehr im AD-Benutzer 3.: Über die GPO pro Firma/Mandant ein Loginscript ausführen 4.: Gruppen erstellen für Anwendungen (z.B: Datev, SFIRM, usw.) 5.: In den Gruppen per GPO weitere Anmeldescripte hinterlegen Aber: Bevor ich das ganze ausprobiere, weil ich da ja im AD mal so richtig viel Zeit zum aufräumen investieren müsste möchte ich vorher mal fragen ob dies so überhaupt funktioniert. Ich hätte dann ja z.B. das Script Mandant1.vbs welches sämtliche Laufwerke und Drucker für sämtliche User verbindet. Zusätzlich wenn User1.1 in der Gruppe "Datev" Mitglied ist wird noch das Netzlaufwerk für Datev verbunden. Ich hoffe ich konnte mich verständlich ausdrücken und würde mich über weitere Vorschläge und Antworten freuen. Gruß, Slupor bearbeitet 19. Dezember 2013 von Slupor Zitieren Link zu diesem Kommentar
lefg 276 Geschrieben 19. Dezember 2013 Melden Teilen Geschrieben 19. Dezember 2013 (bearbeitet) Ich möchte nun mit so wenig Scripten wie möglich eine Lösung finden Hallo Ginge es auch ohne Anmeldeskript, könnten die User selbst die Netzlaufwerkverbindungen einrichten mit dem Explorer unter Extras, Netzlaufwerk verbinden? Zur Unterstützung eine bebilderte Handreichung geben, eine Präsentation in Powerpoint. Wurde schon erwogen, die Laufwerkverbindungen per GPO/GPP zu erstellen? bearbeitet 19. Dezember 2013 von lefg Zitieren Link zu diesem Kommentar
Sunny61 807 Geschrieben 19. Dezember 2013 Melden Teilen Geschrieben 19. Dezember 2013 Schau dir innerhalb der Group Policy Preferences die Zielgruppenadressierung an. Da hast Du eine schöne GUI, die IMHO weitaus übersichtlicher ist als ein VB-Script. http://www.gruppenrichtlinien.de/artikel/group-policy-preferences-gpp/ Zielgruppenadressierung: http://evilgpo.blogspot.de/2013/03/zielgruppenadressierung-oder.html Zitieren Link zu diesem Kommentar
Slupor 10 Geschrieben 19. Dezember 2013 Autor Melden Teilen Geschrieben 19. Dezember 2013 Die Laufwerke sollen auf keinen Fall fest verbunden werden. Die Aufgaben der User ändern sich mit der Zeit und ich will ohne viel Aufwand den Usern die nötigen Laufwerke zur verfügung stellen. Meine Idee war, wenn z.B. User2.1 momentan nicht in Datev arbeitet bekommt er kein Laufwerk L (auch keinen Zugriff wenn er es über \\Servername\Datev aufrufen sollte). Das ganze ist dann mit der Pflege des AD im Prinzip komplett geschehen. Sollte User2.1 aber nun in 6 Monaten doch in Datev arbeiten müssen, dann ist er ab da einfach zusätzlich "Mitglied von DatevUsers" und bekommt automatisch das Laufwerk L bei Anmeldung verbunden. Wenn er wiederum in weiteren 3 Monaten keinen Datev Zugriff mehr haben soll nehme ich ihn einfach aus der Gruppe raus und somit verschwindet bei der nächsten Abmeldung automatisch das Laufwerk L und kommt bei erneuter Anmeldung nicht wieder. Zum Thema Laufwerke selbst verbinden... Fällt leider aus, es wird über Citrix und veröffentlichte Anwendungen gearbeitet. Es geht ja auch nicht nur um Laufwerke, sondern auch um freigegebene Drucker, Standartdrucker setzen, usw. Ich selbst finde da ein einseitiges VB-Script doch übersichtlicher als eine GUI in der jeder Punkt dann in einer anderen Registerkarte steckt. Desweiteren bin ich mehr der Konsolen-Fan und auch davon nicht abzubringen :) Meine Frage ist lediglich noch folgende: Geht das so wie ich mir das vorstelle oder nicht? Zitieren Link zu diesem Kommentar
lefg 276 Geschrieben 19. Dezember 2013 Melden Teilen Geschrieben 19. Dezember 2013 (bearbeitet) Meine Frage ist lediglich noch folgende: Geht das so wie ich mir das vorstelle oder nicht?Die Antwort von Radio Eriwan lautet: Im Prinzip schon, .... . Ob nun Batch oder VBS oder PS, was ändert das? Mit welchen Mittel möchtest Du das Verbinden nun wirklich steuern, mit der Zugehörigkeit der User zu Sicherheitsgruppen? Eine Sicherheitsgruppe für jeden Mandanten anlegen? Edit: Mit Skripte oder ohne? Einerseits fragt die Überschrift ob mehrere Anmedeskripte möglich, aber in der Eröffnung steht geschrieben, so wenig Anmeldeskripte wie möglich. In einem Skript kann abgefragt werden, ob ein User Mitglied einer Sicherheitsgruppe ist und abhängig vom Ergebnis ein Laufwerk verbunden werden oder eben nicht. bearbeitet 19. Dezember 2013 von lefg Zitieren Link zu diesem Kommentar
Slupor 10 Geschrieben 20. Dezember 2013 Autor Melden Teilen Geschrieben 20. Dezember 2013 (bearbeitet) '**************** Bei einem Fehler nicht abbrechen, sondern weiterlaufen **************** On Error Resume Next Option Explicit '**************** Variablen deklarieren und initialisieren **************** Dim fso Dim objNetwork Dim strComputer Dim oShell Dim objWMIService Dim colInstalledPrinters Dim objPrinter Dim user strComputer = "." Set objWMIService = GetObject ("winmgmts:\\" & strComputer & "\root\cimv2") Set colInstalledPrinters = objWMIService.ExecQuery _ ("Select * From Win32_Printer Where Network = True") Set fso = CreateObject ("Scripting.FileSystemObject") Set oShell = CreateObject( "WScript.Shell" ) Set objNetwork = CreateObject("WScript.Network") user=oShell.ExpandEnvironmentStrings("%UserName%") '**************** Netzlaufwerke prüfen und neu verbinden **************** '**************** Laufwerk G "Daten" **************** If fso.DriveExists ("G:") Then objNetwork.RemoveNetworkDrive "G:", True, True Else WScript.Sleep 100 End If objNetwork.MapNetworkDrive "G:", "\\FS-1\Daten", True '**************** Laufwerk Z "Daten User Individuell" **************** If fso.Folderexists("\\FS-1\Daten-User-Individuell\" & user) = True Then If fso.DriveExists ("Z:") Then objNetwork.RemoveNetworkDrive "Z:", True, True Else WScript.Sleep 100 End If objNetwork.MapNetworkDrive "Z:", "\\FS-1\Daten-User-Individuell\"& user, True Else WScript.Sleep 100 End If '**************** alle benötigten Drucker prüfen und neu verbinden **************** For Each objPrinter in colInstalledPrinters objPrinter.Delete_ Next objNetwork.AddWindowsPrinterConnection "\\PS-1\PRN1" objNetwork.AddWindowsPrinterConnection "\\PS-1\PRN2" objNetwork.AddWindowsPrinterConnection "\\PS-1\PRN3" objNetwork.AddWindowsPrinterConnection "\\PS-1\PRN4" '**************** Standartdrucker festlegen **************** objNetwork.SetDefaultPrinter "\\PS-1\PRN2" Für alle die mal eins brauchen, hier mein VB-Login-Script Klar kann ich das im Script abfragen, aber dann wiederum wird das Script doch wieder etwas umständlicher und es sollen ja auch mal zukünftig eventuell Leute damit klar kommen die in VBS nicht so ganz bewandert sind. Wie meine AD-Struktur aussieht steht oben, es soll zusätzlich zu den Mandanten noch Sicherheitsgruppen geben für z.B. Datev und Sfirm So wenig wie möglich war wohl eher auf die jetzige Situation bezogen, weil momentan jeder zum Standart-Loginscript noch sein persönliches zusätzlich besitzt, stand aber auch oben... bearbeitet 20. Dezember 2013 von Slupor Zitieren Link zu diesem Kommentar
lefg 276 Geschrieben 20. Dezember 2013 Melden Teilen Geschrieben 20. Dezember 2013 Moin moin Wat dem eenen sin Uhl, is dem annern sin Nachtigall. So kann man es natürlich auch machen. Zitieren Link zu diesem Kommentar
Slupor 10 Geschrieben 20. Dezember 2013 Autor Melden Teilen Geschrieben 20. Dezember 2013 (bearbeitet) Set objShell = CreateObject( "WScript.Shell" ) user=objShell.ExpandEnvironmentStrings("%UserName%") Set WshNetwork = WScript.CreateObject("WScript.Network") domain = WshNetwork.UserDomain txt = "#" Set oGroups = GetObject("WinNT://" & domain & "/" & user) For Each oGroup In oGroups.Groups txt = txt & oGroup.Name & "#" Next eingabe=INPUTBOX("Welche Gruppe soll abgefragt werden:") If InStr(txt, "#" & eingabe & "#") > 0 Then MsgBox "Der Benutzer " & user & " ist Mitglied der Gruppe " & eingabe & "!" Else MsgBox "Der Benutzer " & user & " ist NICHT Mitglied der Gruppe " & eingabe & "!" End If Für alle die noch mehr wollen, damit kann man die Zugehörigkeit einer Gruppe abfragen. Lässt sich im Prinzip auch problemlos in das Script einbauen... bearbeitet 20. Dezember 2013 von Slupor Zitieren Link zu diesem Kommentar
tastendruecker 10 Geschrieben 24. Dezember 2013 Melden Teilen Geschrieben 24. Dezember 2013 @Slupor Also von Skripten haben wir uns,was Laufwerkszuweisungen angeht, schon länger verabschiedet. Geht meines Erachtens viel einfacher über den Weg wie es @Sunny61 beschrieben hat. Ist übersichtlicher, einfacher anzupassen und hat ne GUI. Gerade wenn Du viele Benutzergruppen und Netzlaufwerke wie zum Beispiel WINDVSW1 bei Datev hast :-) Zitieren Link zu diesem Kommentar
Slupor 10 Geschrieben 3. Januar 2014 Autor Melden Teilen Geschrieben 3. Januar 2014 (bearbeitet) '********************************************************************************************************' Option Explicit On Error Resume Next '********************************************************************************************************' '****************************************** Variablen zuweisen ******************************************' Dim fso Dim objNetwork Dim strComputer Dim objShell Dim objGroups Dim objWMIService Dim colInstalledPrinters Dim objPrinter Dim user Dim domain Dim objGroup Dim Groups Dim Computer Dim PrintQueue Dim PRNAME Dim PRSName strComputer = "." Set objWMIService = GetObject ("winmgmts:\\" & strComputer & "\root\cimv2") Set colInstalledPrinters = objWMIService.ExecQuery _ ("Select * From Win32_Printer Where Network = True") Set fso = CreateObject ("Scripting.FileSystemObject") Set objShell = CreateObject("WScript.Shell") Set objNetwork = CreateObject("WScript.Network") domain = objNetwork.UserDomain Groups = "#" PRNAME = "" PRSName = "PS-1" user=objShell.ExpandEnvironmentStrings("%UserName%") Set objGroups = GetObject("WinNT://" & domain & "/" & user) Set Computer = GetObject("WinNT://" & PRSName & ",Computer") Computer.Filter = Array("PrintQueue") '********************************************************************************************************' '************************************ Gruppenmitgliedschaft abfragen ************************************' For Each objGroup In objGroups.Groups Groups = Groups & objGroup.Name & "#" Next '********************************************************************************************************' '********************************************* Datev-Gruppe *********************************************' If InStr(Groups, "#Datev#") > 0 Then '++++++++++++++++++++++++++++++++++++++ Laufwerk L "Datev" ++++++++++++++++++++++++++++++++++++++' If fso.DriveExists ("L:") Then objNetwork.RemoveNetworkDrive "L:", True, True End If objNetwork.MapNetworkDrive "L:", "\\DATEV-SRV\DATEV ", True '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++' End If '********************************************************************************************************' '*********************************************** All-User ***********************************************' If InStr(Groups, "#Alle#") > 0 Then '++++++++++++++++++++++++++++++++++++++ Laufwerk G "Daten" ++++++++++++++++++++++++++++++++++++++' If fso.DriveExists ("G:") Then objNetwork.RemoveNetworkDrive "G:", True, True End If objNetwork.MapNetworkDrive "G:", "\\File-SRV\Daten", True '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++' '+++++++++++++++++++++++++++++ Laufwerk Z: "Daten User Individuell" +++++++++++++++++++++++++++++' If fso.Folderexists("\\File-SRV\Daten-User-Individuell\" & user) = True Then If fso.DriveExists ("Z:") Then objNetwork.RemoveNetworkDrive "Z:", True, True End If objNetwork.MapNetworkDrive "Z:", "\\File-SRV\Daten-User-Individuell\"& user, True End If '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++' End If '********************************************************************************************************' '****************************** alle bestehenden Netzwerkdrucker entfernen ******************************' For Each objPrinter in colInstalledPrinters objPrinter.Delete_ Next '********************************************************************************************************' '********************************************** Drucker 18 **********************************************' If InStr(Groups, "#18#") > 0 Then For Each PrintQueue In Computer PRNAME = PRNAME & PrintQueue.PrinterName & vbCrlf If Instr(PrintQueue.PrinterName, "PS-1\18-") > 0 then objNetwork.AddWindowsPrinterConnection PrintQueue.PrinterName End If Next PRNAME = "" End If '********************************************************************************************************' '********************************************** Drucker 32 **********************************************' If InStr(Groups, "#32#") > 0 Then For Each PrintQueue In Computer PRNAME = PRNAME & PrintQueue.PrinterName & vbCrlf If Instr(PrintQueue.PrinterName, "PS-1\32-") > 0 then objNetwork.AddWindowsPrinterConnection PrintQueue.PrinterName End If Next PRNAME = "" End If '********************************************************************************************************' '********************************************** Drucker 42 **********************************************' If InStr(Groups, "#42#") > 0 Then For Each PrintQueue In Computer PRNAME = PRNAME & PrintQueue.PrinterName & vbCrlf If Instr(PrintQueue.PrinterName, "PS-1\42-") > 0 then objNetwork.AddWindowsPrinterConnection PrintQueue.PrinterName End If Next PRNAME = "" End If '********************************************************************************************************' '************************************** Standart-Drucker festlegen **************************************' objNetwork.SetDefaultPrinter "\\PS-1\18-L202" '********************************************************************************************************' Hier nun mal das bisher fertige Script, damit komme ich wohl ganz gut hin, das einzige was mir noch fehlt ist am Ende die Geschichte mit dem Standart-Drucker, der soll natürlich auch noch dynamisch werden. Es existiert wohl auch schon eine Excel-Datei wo drin steht, wer welchen Standartdrucker hat, ob man diese wohl so verwenden kann als externe Datenquelle? Ich persönlich finde das Script doch sehr überschaubar und übersichtlich, vor allem halt eben alles an einem Fleck. Gibts irgendwo ne Ecke hier im Forum für fertige Scripte zum veröffentlichen, wenn ich alles habe? Was ist eigenlich der unterschied zwischen: Dim var_a Dim var_b Dim var_c und Dim var_a, var_b, var_c Sollte es da keinen geben wäre dann ja doch alles noch um ein paar Zeilen kürzer das ganze, wenn ich da alles in eine Zeile quetsche, oder? Wurde bisher in keinem Tutorial erklärt das ich gefunden habe und wonach ich bei Google suchen sollte um das zu erfahren wüsste ich momentan auch nicht... Wenn meine Vermutung richtig ist dürfte es bei VBS egal sein wie ich das schreibe, nur bei VB nicht, zumindest dann nicht wenn ich noch deklariere was für eine Art von Variable es sein soll (as integer, usw.) aber bei VBS geht das ja garnicht... Oder täusche ich mich hier? bearbeitet 3. Januar 2014 von Slupor Zitieren Link zu diesem Kommentar
zahni 554 Geschrieben 3. Januar 2014 Melden Teilen Geschrieben 3. Januar 2014 Hi, soweit ich das sehe, lässt sich das alles viel schneller und eleganter mit GPP's machen. Dort kann man Drucker und Laufwerke, in Abhängigkeit von Gruppenmitgliedschaften, verbinden. -Zahni Zitieren Link zu diesem Kommentar
Sunny61 807 Geschrieben 3. Januar 2014 Melden Teilen Geschrieben 3. Januar 2014 (bearbeitet) Was ist eigenlich der unterschied zwischen: Dim var_a Dim var_b Dim var_cundDim var_a, var_b, var_cSollte es da keinen geben wäre dann ja doch alles noch um ein paar Zeilen kürzer das ganze, wenn ich da alles in eine Zeile quetsche, oder? Wurde bisher in keinem Tutorial erklärt das ich gefunden habe und wonach ich bei Google suchen sollte um das zu erfahren wüsste ich momentan auch nicht... Wenn meine Vermutung richtig ist dürfte es bei VBS egal sein wie ich das schreibe, nur bei VB nicht, zumindest dann nicht wenn ich noch deklariere was für eine Art von Variable es sein soll (as integer, usw.) aber bei VBS geht das ja garnicht... Oder täusche ich mich hier? Bei VBS ist es egal, in VB(<=6) und VBA ist es natürlich etwas anderes: VB(<=6) und VBA korrekt: dim a as String, b as String Falsch bzw. es wird jede Variable als Variant deklariert wenn sie nicht explizit deklariert wird: Dim a as String, b, c b und c werden als Variant deklariert. VB.Net (>=7) Dim a, b, c as string Es werden a, b und c als String deklariert. Das in eine Zeile quetschen ist nur für die Anzahl der Zeilen besser, übersichtlich ist IMHO das untereinander schreiben. Aber das ist vermutlich auch Geschmackssache. ;) bearbeitet 3. Januar 2014 von Sunny61 1 Zitieren Link zu diesem Kommentar
Slupor 10 Geschrieben 6. Januar 2014 Autor Melden Teilen Geschrieben 6. Januar 2014 (bearbeitet) Set Conn = CreateObject("ADODB.Connection") Set fso = CreateObject("Scripting.FileSystemObject") Set fdesc = fso.OpenTextFile("C:\test.txt", 8, True) Set objShell = CreateObject("WScript.Shell") user=objShell.ExpandEnvironmentStrings("%UserName%") PRSName = "PS-1" ' Connect to the database strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\STDPRN.mdb" Conn.Open strConnect StrSQL = "Select * FROM PRN1 WHERE USR = user" Set RS = Conn.Execute(StrSQL) fdesc.WriteLine("\\" & PRSName & "\" & RS("PRN") & vbCrlf & "Standartdrucker gesetzt!") RS.Close Conn.close obigen Code verwende ich aktuell um aus einer Access-DB Daten auszulesen. Wenn ich den Usernamen von Hand eingebe funktioniert das ganze auch so wie es soll, aber ich will ja den Usernamen Variabel haben, wie kann ich meinem VB-Script sagen er soll nicht den user "user" suchen sondern die Variable user? z.B. m.mustermann ist am System angemeldet, dementsprechend soll da stehen >>StrSQL = "Select * FROM PRN1 WHERE USR = m.mustermann"<< bearbeitet 6. Januar 2014 von Slupor Zitieren Link zu diesem Kommentar
Sunny61 807 Geschrieben 6. Januar 2014 Melden Teilen Geschrieben 6. Januar 2014 Du mußt die Variable richtig einpacken: StrSQL = "Select * FROM PRN1 WHERE USR = "'" & user & "'" Du kannst übrigens in einer VBA-Umgebung solche Scripte vollständig testen. Dim strUser Dim strSQL Set objShell = CreateObject("WScript.Shell") strUser = objShell.ExpandEnvironmentStrings("%UserName%") strSQL = "Select * FROM PRN1 WHERE USR = '" & strUser & "'" Debug.Print strSQL In einem VB-Script kannst Du das recht einfach mit Hilfe von WScript.Echo testen. Dim strUser Dim strSQL Set objShell = CreateObject("WScript.Shell") strUser = objShell.ExpandEnvironmentStrings("%UserName%") strSQL = "Select * FROM PRN1 WHERE USR = '" & strUser & "'" WScript.Echo strSQL WScript.Echo strUser 1 Zitieren Link zu diesem Kommentar
NeMiX 76 Geschrieben 6. Januar 2014 Melden Teilen Geschrieben 6. Januar 2014 Ich frag mich gerade warum du dieses vbs Ungetüm gebaut hast. Mit GPPs wäre das alles wesentlich einfacher gegangen. Selbst ein vernünftiges cmd Script wäre vermutlich mit ca. 10-15 Zeilen ausgekommen... Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.