ohnepower
Goto Top

Anmeldescript unter MS-Server 2k3 - aber wie?

Hallo...

das Thema Anmeldescripte ist hier ja schon fast ausgereizt, trotzdem... ich komm nicht wirklich klar, wer kann helfen?

Ich möchte "ein" Anmeldescript für alle User einrichten:

Folgende Struktur ist gegeben....

User
+Freigabe Ordner Public
+Drucker 1
Gruppe 1
+Drucker 2
+Drucker 3
+Gruppenverzeichnis
Gruppe 2
+ ähnlich wie oben

Gibt es eine Möglichkeit, das automatisch abgefragt wird, welcher Gruppe die User angehören. Dementsprechend würde ich gerne die Drucker und Verzeichnisse "vergeben"!?

vbScripte sind ja recht umfangreich...


Wer kann helfen?

Danke...

Content-Key: 2509

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

Ausgedruckt am: 29.03.2024 um 08:03 Uhr

Mitglied: linkit
linkit 13.09.2004 um 21:16:16 Uhr
Goto Top
Also mit einer normalen Batchdatei geht das nicht... da mußt du schon mit VB-Skript ran, allerdings ist das nicht ganz trivial. Ich kann dir jetzt auch nicht ein Seitenlanges Skript hier schreiben, sondern nur prinzipiell sagen, wie es geht. Du mußt dich also schon etwas damit befassen.

Es ist deswegen nicht ganz einfach, weil du den Benutzer mit dem ADS vergleichen und die Gruppenzugehörigkeit abfragen mußt. Dieser kann aber auch mehreren Gruppen angehören. Die entsprechende Gruppe muß aussortiert werden.

Nach dieser Gruppe können dann Freigaben und Drucker verteilt werden. Problematisch ist es, wenn Gruppenüberschneidungen da sind. Angenommen man hat die Gruppe Buchhaltung und Gruppe Verwaltung. Beide dürfen auf zwei unterschiedliche Bereiche zugreifen. Der Chef ist aber Mitglied beider Gruppen und darf somit auf beide Bereiche zugreifen, dann muß auch dies in deinem Skript berücksichtigt werden.


Wenn du nur ein paar Benutzer hast, dann kannst du das auch anderst lösen und nur die Benutzer abfragen,d as würde in etwa so aussehen:


*++
*++


Set WSHShell = WScript.CreateObject("WScript.Shell")

Key = "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"


user = WshShell.RegRead( Key & "\DefaultUserName" )

' Allgemein


WSHShell.run "net use m: /d"
WSHShell.run "net use n: /d"

WSHShell.run "net use n: \\company\dfs\public /persistent:no"
WSHShell.run "net use o: \\company\dfs\company /persistent:no"


select case user
case "mueller"
WSHShell.run "net use m: \\company\dfs\private\mueller /persistent:no"
case "meyer"
WSHShell.run "net use m: \\company\dfs\private\meyer /persistent:no"
case "schmidt"
WSHShell.run "net use m: \\company\dfs\private\schmidt /persistent:no"
end select


*++
*++


Wie gesagt, daß ist nur eine Lösung, wenn du nur ein paar User hast.

1. Am Anfang wird der User abgefragt.
2. Dann werden alle Möglichen Verbindungen getrennt
3. Danach werden allgemeine Verbindungen gesetzt
4. Jetzt wird über den select der user abgefragt und dann Verbindungen hergestellt

**


Das was du vor hast, ist wesentlich komplexer... und würde hier wohl den Rahmen sprengen
Mitglied: 5274
5274 08.10.2004 um 20:01:20 Uhr
Goto Top
Hi,
im Resource Kit oder im ZAK (weiß nicht genau) gibt es ein Tool mit Namen ifmember.exe mit dem man die Gruppenzugehörigkeit auslesen kann. Wenn es in einem share liegt, sollte man es aus einem Script heraus aufrufen können (ähnlich wie con2prt)
Mitglied: cosy
cosy 28.02.2006 um 20:34:07 Uhr
Goto Top
Halt mal!
Der Vorschlag geht auch, wenn Du viele User hast.
Du musst einfach den Usernamen in einer Variablen speichern, um dann diese Variable (oder besser der Inhalt jener) mit dem immer gleich bleibenden Teil des Pfades zu "concatonaten".
So reicht eine einzige Sequenz anstelle einer massigen CASE Anweisung.

Übrigens:
Ich bin krass erstaunt, dass sowas nicht auf einfache Art in W2K3 möglich ist. Das ist für mich wie Steinzeit.
Ich administriere seit Jahren Novell. Dort geht das total einfach. Drucker werden über NDPS und dessen Datenbank RBS mittels so etwas wie ACL's dynamisch zugeteilt. Der korrekte Druckertreiber wird im Hintergrund automatisch aufgrund des Betriebssystems ausgesucht herungergeladen und installiert falls nicht vorhanden.
Verzeichnisse werden aufgrund Rollenzugehörigkeit sowie OU-Zugehörigkeit gemappt sowie Rechte, Serviceverfügbarkeit usw gesetzt. Das Ganze ist wirklich einfach und funktioniert...
Grüsse Bruno
Mitglied: tigger30926
tigger30926 13.09.2006 um 13:59:13 Uhr
Goto Top
Hallo linkit,

deinen Ansatz für das Anmeldescript finde ich klasse.

Ich habe es einfach mal ausporbiert und es hat sofort geklappt, nur eine Kleinigkeit ist
blöd. Der User muss seinen Anmeldename entweder immer klein schreiben oder immer groß. Macht er das nicht läuft das Script einfach durch ohne ein Laufwerk zu verbinden.

Ist ja auch klar weil der den User so nicht finden kann.

Meine Lösung war, ich habe einfach alle Möglichkeiten wie ein User seinen Anmeldenamen schreiben kann mit in das Script eingebaut. Das das ist aber sehr aufwendig.

Hast du dazu nicht noch einen Tipp bzw. eine kleine Verbesserung für uns ?

Dann noch eine Frage, wie kann ich da noch einen Netzwerkdrucker der über einen PrintServer angeschloßen ist mit einbauen. Es sollte auch hier sichergestellt werden das kein anderer Drucker mehr verbunden ist.

Gruß und vielen Dank
Tigger30926
Mitglied: gemini
gemini 13.09.2006 um 14:12:55 Uhr
Goto Top
Hallo tigger,

auch das lässt sich einfach lösen.

Der entspr. Ausschnitt aus linkits Script:

'#######################
select case LCase(user)
case "mueller"
WSHShell.run "net use m: \\company\dfs\private\mueller /persistent:no"
case "meyer"
WSHShell.run "net use m: \\company\dfs\private\meyer /persistent:no"
case "schmidt"
WSHShell.run "net use m: \\company\dfs\private\schmidt /persistent:no"
end select
'#######################
LCase für Lower Case wandelt alles in kleinbuchstaben um, alternativ UCase für GROSSBUCHSTABEN. Muss natürlich mit dem nachfolgenden konform gehen.


Die Zeilen mit WSHShell.run "net use m: \\company\dfs\private\schmidt /persistent:no"
kann man auch auch VBS-mäßig mit MapNetworkDrive lösen.

Viele und gute Infos zu VBS kannst du auf Guy Thomas' Seite http://www.computerperformance.co.uk/ finden und natürlich im ScriptCenter http://www.microsoft.com/technet/scriptcenter/default.mspx

HTH
gemini
Mitglied: tigger30926
tigger30926 13.09.2006 um 14:23:21 Uhr
Goto Top
Prima vielen Dank,

hast du noch eine Tipp wie ich das mit dem Drucker lösen kann?

Gruß
Tigger 30926
Mitglied: gemini
gemini 13.09.2006 um 14:37:50 Uhr
Goto Top
Mitglied: tigger30926
tigger30926 13.09.2006 um 14:52:22 Uhr
Goto Top
Super vielen Dank, ja habe ich gleich gemacht. Aber ich habe da nicht das richtige gefunden.

Das verbinden klappt ja jetzt, aber das überpürfen ob der Drucker schon vorhanden ist geht so natürlich nicht.

Dazu kommt noch, wenn der Benutzer sich abmeldet und ein anderer Benutzer (Spätschicht) sich dann anmeldet. Behält er die Drucker des anderen. Das soll so aber so nicht sein. Gibt es nicht einen Löschbefehl der auch in einem Fehlerfall zb. wenn gar kein Drucker verbunden war, seinen Dienst verrichtet und dann keine Fehlermeldung ausgibt?

Gruß
Tigger30926
Mitglied: gemini
gemini 13.09.2006 um 15:19:54 Uhr
Goto Top
Ich lösche die Drucker mit nachfolgender Routine bevor ich sie neu verbinde.

'############################
Const blnForce = TRUE
Set WshNetwork = Wscript.CreateObject("Wscript.Network")
strPrintSRV1 = <Druckserver>
strComputer = LCase(WshNetwork.ComputerName)
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colPrinters = objWMIService.ExecQuery("Select * from Win32_Printer")

For Each objPrinter in colPrinters
If Left(objPrinter.Name, 8) = "\\" & strPrintSRV1 Then
WshNetwork.RemovePrinterConnection "\\" & strPrintSRV1 & "\" & objPrinter.ShareName, blnForce
End If
Next
'############################
Mitglied: tigger30926
tigger30926 13.09.2006 um 16:29:02 Uhr
Goto Top
Prima Tipp, ich habe es jetzt mal so ausprobiert läuft spitze.

Hast du jetzt vielleicht noch einen Tipp wie ich ein Log-File mit einbauen kann, sodas ich dann Zentral sehen kann wenn es zu einem Fehler gekommen ist.

Ich dachte über einen Ordner im NETLOGON nach, indem die Log Files abgelegt werden, oder vielleicht in einem Ordner auf dem Client selber.

Hier unsere Script Version !!!! face-smile

Set WSHShell = WScript.CreateObject("WScript.Shell")
Set WshNetwork = CreateObject("WScript.Network")
Set Network = CreateObject("Wscript.Network")

'----------------------------------------------------------
'Angemeldeter User heraus finden
'----------------------------------------------------------

Key = "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"

user = WshShell.RegRead( Key & "\DefaultUserName" )

'----------------------------------------------------------
'Löschen eventuell bestehender Netzlaufwerke
'----------------------------------------------------------

WSHShell.run "net use e: /d"
WSHShell.run "net use f: /d"
WSHShell.run "net use g: /d"
WSHShell.run "net use h: /d"
WSHShell.run "net use j: /d"
WSHShell.run "net use n: /d"

'----------------------------------------------------------
'Löschen eventuell bestehender Printerconnections
'----------------------------------------------------------
For i = 0 To network.EnumPrinterConnections.Count - 1
On Error Resume Next
network.RemovePrinterConnection network.EnumPrinterConnections.Item(i)
Next

'----------------------------------------------------------
'Netzlaufwerke und Drucker je nach Benutzer zu ordnen
'----------------------------------------------------------

select case LCase(user)
case "fritz"
WSHShell.run "net use e: \\server\freigabename /persistent:no"
WSHShell.run "net use f: \\server\freigabename /persistent:no"
WSHShell.run "net use g: \\server\freigabename /persistent:no"
WSHShell.run "net use h: \\server\freigabename /persistent:no"
WSHShell.run "net use i: \\server\freigabename /persistent:no"

WshNetwork.AddWindowsPrinterConnection "\\server\druckername"
WshNetwork.AddWindowsPrinterConnection "\\server\druckername"
WshNetwork.AddWindowsPrinterConnection "\\server\druckername"
WshNetwork.SetDefaultPrinter "\\server\druckername"

case "meyer"
WSHShell.run "net use m: \\server\freigabename /persistent:no"
case "schmidt"
WSHShell.run "net use m: \\server\freigabename /persistent:no"
end select

Das wars schon !!!! War gar nicht soooo schlimm.

Gruß
Tigger30926
Mitglied: gemini
gemini 13.09.2006 um 16:55:37 Uhr
Goto Top
Hast du jetzt vielleicht noch einen Tipp wie ich ein Log-File mit einbauen kann, sodas ich
dann Zentral sehen kann wenn es zu einem Fehler gekommen ist.
Tipp kannst du haben face-smile
Beschäftige dich eingehender mit dem err-Objekt und dem FileSystemObject.

Ich dachte über einen Ordner im NETLOGON nach, indem die Log Files abgelegt
werden, oder vielleicht in einem Ordner auf dem Client selber.
Nun ja, der Benutzer unter dem das Script ausgeführt wird braucht auf dem Log-Verzeichnis Schreibrechte; ich weiß nicht, ob das auf dem NETLOGON so gut kommt?

Hier unsere Script Version !!!! face-smile
.
.
Das wars schon !!!! War gar nicht soooo schlimm.
Auf menschliche Sprachen umgemünzt würde man es wohl als Kauderwelsch bezeichnen face-wink

Nix für ungut, in erster Linie muss es funktionieren
Mitglied: tigger30926
tigger30926 14.09.2006 um 10:02:35 Uhr
Goto Top
So habe das Script nochmals überarbeitet und jetzt legt das Script entweder in einem freigegeben Verzeichniss oder auf dem Client selber eine Log-Datei ab.

Leider habe noch ein kleines Problem bei der Auflistung der Netzwerkdrucker. Egal was ich mache es werden immer nur zwei Drucker in die Log-Datei geschrieben.

Der erste Drucker und der Standard Drucker. Alle anderen nicht ! Was ist nur falsch?

Dann möchte ich noch die Zeit vom Client überpüfen und wenn die nicht stimmt, sie autom. abgleichen. Hat dazu auch einer eine Idee ?

'----------------------------------------------------------
'Anmeldescript für die Domäne-User / Stand 13.09.2006
'----------------------------------------------------------

Set WSHShell = WScript.CreateObject("WScript.Shell")
Set WshNetwork = CreateObject("WScript.Network")
Set Network = CreateObject("Wscript.Network")
Set MyFiles = CreateObject("Scripting.FileSystemObject")

'----------------------------------------------------------
'Angemeldeter User heraus finden
'----------------------------------------------------------

Key = "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"

user = WshShell.RegRead( Key & "\DefaultUserName" )

Do While wshNetwork.username = ""
WScript.Sleep 250
Loop
MeinDatum = Date
strComputerName = wshNetwork.computerName
strUserName = wshNetwork.userName
strDomainName = wshNetwork.userDomain

If Not MyFiles.FileExists("d:\data\" & strComputerName & "-" & user & "-" & meindatum & ".log") Then MyFiles.CreateTextFile("d:\data\" & strComputerName & "-" & user & "-" & meindatum & ".log")
Set logfile = MyFiles.OpenTextFile("d:\data\" & strComputerName & "-" & user & "-" & meindatum & ".log",8)

'----------------------------------------------------------
'Löschen eventuell bestehender Netzlaufwerke
'----------------------------------------------------------

WSHShell.run "net use * /d:yes"

'----------------------------------------------------------
'Löschen eventuell bestehender Printerconnections
'----------------------------------------------------------
For i = 0 To network.EnumPrinterConnections.Count - 1
On Error Resume Next
network.RemovePrinterConnection network.EnumPrinterConnections.Item(i)
Next

'----------------------------------------------------------
'Netzlaufwerke und Drucker je nach Benutzer zu ordnen
'----------------------------------------------------------

'* Aufruf der Subroutine
Call SubZusammenfassung
'* Die Routine
Sub SubZusammenfassung ()
'* Benötigte Deklarationen

Set colDrives = wshNetwork.EnumNetworkDrives
Set colPrinters = wshNetwork.EnumPrinterConnections

Dim CRLF
CRLF = Chr(13) & Chr(10)
'* Der Beginn des Wahnsinns
strMsg = cRLF & CRLF & "------------------" & CRLF & "Anmelde Ergebnisse" & CRLF & CRLF & "Benutzername" & Chr(9) & "= " & strUserName & CRLF & "Computername" & Chr(9) & "= " & strComputerName & CRLF & "Domäne" & Chr(9) & Chr (9) & "= " & strDomainName & CRLF

select case LCase(user)
case "fritz"
WSHShell.run "net use e: \\server\freigabename /persistent:no"
WSHShell.run "net use f: \\server\freigabename /persistent:no"
WSHShell.run "net use g: \\server\freigabename /persistent:no"
WSHShell.run "net use h: \\server\freigabename /persistent:no"
WSHShell.run "net use i: \\server\freigabename /persistent:no"

WshNetwork.AddWindowsPrinterConnection "\\server\druckername"
WshNetwork.AddWindowsPrinterConnection "\\server\druckername"
WshNetwork.AddWindowsPrinterConnection "\\server\druckername"
WshNetwork.SetDefaultPrinter "\\server\druckername"

case "meyer"
WSHShell.run "net use m: \\server\freigabename /persistent:no"
case "schmidt"
WSHShell.run "net use m: \\server\freigabename /persistent:no"
end select

If colDrives.Count = 0 Then
strMsg = strMsg & CRLF & "Kein Netzlaufwerk ist verbunden." & CRLF
Else
strMsg = strMsg & CRLF & "Verbundene Netzlaufwerk(e):" & CRLF
For i = 0 To colDrives.Count - 1 Step 2
strMsg = strMsg & CRLF & colDrives(i) & Chr(9) & colDrives(i + 1)
Next
End If
'* Verbundene Drucker Listen
If colPrinters.Count = 0 Then
strMsg = strMsg & CRLF & CRLF & "Kein Netzwerk-Drucker ist verbunden." & CRLF
Else
strMsg = strMsg & CRLF & CRLF & "Verbundene Netzwerk-Drucker:" & CRLF
For i = 0 To colPrinters.Count - 1 Step 2
strMsg = strMsg & CRLF & colPrinters(i + 1) & Chr(9)
Next
logfile.write(strMsg)
End If
logfile.close
End Sub


Gruß
Tigger30926
Mitglied: gemini
gemini 14.09.2006 um 10:21:35 Uhr
Goto Top
Ersetz mal diese Zeile
strMsg = strMsg & CRLF & colPrinters(i + 1) & Chr(9)
durch diese
strMsg = strMsg & CRLF & colPrinters(i) & Chr(9) & colPrinters(i + 1)
Mitglied: gemini
gemini 14.09.2006 um 10:22:47 Uhr
Goto Top
<<< Doppelpost >>>
Mitglied: tigger30926
tigger30926 14.09.2006 um 10:29:47 Uhr
Goto Top
Super vielen Dank.
Jetzt geht das auch.

Wie können wir das mit dem Zeitabgleich lösen ?

Fehlt sonst noch was in diesem Script, ich meine habe ich noch was vergessen?
Mitglied: gemini
gemini 14.09.2006 um 10:46:46 Uhr
Goto Top
Wie können wir das mit dem Zeitabgleich lösen ?
Welchen Zeitabgleich?
In einer Domäne ist der authentifizierende DC automatisch autorisierender Zeitserver für den Client.
http://support.microsoft.com/kb/816042/EN-US/
INTRODUCTION
Windows includes W32Time, the Time Service tool that is required by the Kerberos authentication protocol. The purpose of the Windows Time service is to make sure that all computers that are running Microsoft Windows 2000 or later versions in an organization use a common time.

To guarantee appropriate common time usage, the Windows Time service uses a hierarchical relationship that controls authority, and the Windows Time service does not permit loops. By default, Windows-based computers use the following hierarchy:
All client desktop computers nominate the authenticating domain controller as their in-bound time partner.
• All member servers follow the same process that client desktop computers follow.
• All domain controllers in a domain nominate the primary domain controller (PDC) operations master as their in-bound time partner.
• All PDC operations masters follow the hierarchy of domains in the selection of their in-bound time partner.

In this hierarchy, the PDC operations master at the root of the forest becomes authoritative for the organization. We highly recommend that you configure the authoritative time server to gather the time from a hardware source. When you configure the authoritative time server to sync with an Internet time source, there is no authentication. We also recommend that you reduce your time correction settings for your servers and stand-alone clients. These recommendations provide more accuracy and security to your domain.

Falls du das aber, aus welchen Gründen auch immer, über net time machen willst, muss der jeweilige Benutzer das Recht 'Ändern der Systemzeit' haben resp. in der lokalen Gruppe Hauptbenutzer sein.

Was du konfigurieren solltest, ist die Zeitsynchronisation des DC.
Siehe obiger Link, Abschnitt 'Configuring the Windows Time service to use an external time source'