Jump to content

Mehrere Anmeldescripte möglich?


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

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 von Slupor
Link zu diesem Kommentar

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 von lefg
Link zu diesem Kommentar

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

Link zu diesem Kommentar

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?

Link zu diesem Kommentar

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 von lefg
Link zu diesem Kommentar
'**************** 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 von Slupor
Link zu diesem Kommentar
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 von Slupor
Link zu diesem Kommentar

@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 :-)

Link zu diesem Kommentar
  • 2 Wochen später...
'********************************************************************************************************'
	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 von Slupor
Link zu diesem Kommentar

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?

 

 

 

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 von Sunny61
Link zu diesem Kommentar
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 von Slupor
Link zu diesem Kommentar

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
Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...