hawaiixxx
Goto Top

Skript zum setzen von mehr als 8 LoginWorkstations

Server 2000: Mit dem Befehl "NET USER ... /WORKSTATIONS:..." kann man maximal 8 Workstation setzen, auf denen sich ein Benutzer anmelden kann. Mit diesem VBS-Skript sind es beliebig viele!

set args=WScript.Arguments
dim usr
dim Benutzer
if args.Count=1 then
	Benutzer=args(0)
	Set usr = GetObject("WinNT://[Domain-Name]/"&Benutzer&",user")  
	usr.Put "LoginWorkstations", "pc01,pc02,pc03,pc04,pc05,pc06,pc07,pc08,pc09,pc10"  
	usr.SetInfo
end if
'Msgbox "OK:"&usr.PasswordExpired  
'if args.Count=1 then Msgbox "OK:"&args(0)  
'if args.Count>1 then Msgbox "Zu viele Parameter!"  

Content-Key: 79609

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

Printed on: April 23, 2024 at 06:04 o'clock

Member: bastla
bastla Jan 31, 2008 at 22:37:59 (UTC)
Goto Top
Hallo hawaiixxx!

Etwas flexibler wäre es so:
'SetLoginWS.vbs  

'Const strDomain = "domain.local"  

Const U = "U"  
Const C = "C"  
Const UC = "UC"  

Const ForReading = 1

If strDomain = "" Then 'Konstante nicht gesetzt, daher Domäne ermitteln  
	Set objRootDSE = GetObject("LDAP://RootDSE")  
	strDNSDomain = objRootDSE.Get("DefaultNamingContext")  
	strDomain = Mid(Replace(strDNSDomain, ",DC=", "."), 4)  
End If

Set objFSO = CreateObject("Scripting.FileSystemObject")  

Set argsNamed = WScript.Arguments.Named
Set argsUnnamed = WScript.Arguments.Unnamed

If argsNamed.Exists(UC) Then 'Variante Users & Clients in Liste  
	UCL = argsNamed.Item(UC)
	If objFSO.FileExists(UCL) Then 'Listendatei vorhanden  
		arrUsersClients = Split(objFSO.OpenTextFile(UCL, ForReading).ReadAll, vbCrLF)
		For Each strUserClient In arrUsersClients 
			arrUC = Split(strUserClient, ";") 'jede Zeile enthält "User;Clientliste" - daher aufteilen ...  
			SetWS arrUC(0), arrUC(1) ' ... und eintragen  
		Next
	Else 'Listendatei nicht vorhanden  
		WScript.Echo Chr(34) & UL & Chr(34) & " konnte nicht gefunden werden."  
		WScript.Quit(2)
	End If
Else 'getrennte Angabe von Users und Clients  
	intArgPosC = 0 'für "User als Parameter angegeben"  
	If argsNamed.Exists(U) Then 'Datei mit Userliste angegeben  
		UL = argsNamed.Item(U)
		If objFSO.FileExists(UL) Then
			arrUsers = Split(objFSO.OpenTextFile(UL, ForReading).ReadAll, vbCrLF)
		Else
			WScript.Echo Chr(34) & UL & Chr(34) & " konnte nicht gefunden werden."  
			WScript.Quit(2)
		End If
	Else
		If argsUnnamed.Count > 0 Then 'User(liste) als Argument übergeben  
			arrUsers = Split(argsUnnamed(0), ",")  
			intArgPosC = 1
		Else
			Usage
			WScript.Quit(1)
		End If
	End If

	If argsNamed.Exists(C) Then 'Datei mit Clientliste angegeben  
		CL = argsNamed.Item(C)
		If CL <> "" Then  
			If objFSO.FileExists(CL) Then
				arrClients = Split(objFSO.OpenTextFile(CL, ForReading).ReadAll, vbCrLF)
				strClients = Join(arrClients, ",")  
			Else
				WScript.Echo Chr(34) & CL & Chr(34) & " konnte nicht gefunden werden."  
				WScript.Quit(2)
			End If
		End If
	Else
		If argsUnnamed.Count > intArgPosC Then 'Clientliste als Argument angegeben; Index abhängig von Art der Userangabe  
			strClients = argsUnnamed(intArgPosC)
		Else
			Usage
			WScript.Quit(1)
		End If
	End If

	For Each strUser in arrUsers 'für jeden einzelnen User die Clientliste eintragen  
		SetWS strUSer, strClients
	Next
End If

Sub SetWS(strU, strC)
On Error Resume Next 'Errorhandling einschalten  
Set objUsr = GetObject("WinNT://" & strDomain & "/" & strU & ",user")  
If Err.Number = 0 Then
	WScript.Echo objUsr.Name & ":" &vbTab & strC  
	objUsr.Put "LoginWorkstations", strC  
	objUsr.SetInfo
Else
	WScript.Echo strU & ":" & vbTab & "Workstationliste nicht eingetragen!"  
End If
On Error Goto 0 'Errorhandling wieder ausschalten  
End Sub

Sub Usage
WScript.Echo "Usage: " & WScript.ScriptFullName & " /UC:UserAndClientListFile | {{User[,User] | /" & U & ":UserListFile} {Client[,Client] | /" & C & ":ClientListFile}}"  
End Sub
Durch die Verwendung benannter Argumente kannst Du sowohl für die zu bearbeitenden Benutzer und -innen, als auch für die einzutragenden Workstations entweder eine (durch Kommata getrennte) Liste oder eine Datei (mit einem Eintrag je Zeile) übergeben. Daraus ergeben sich exemplarisch folgende Einsatzmöglichkeiten:
cscript //nologo C:\Scripts\SetLoginWS.vbs Benutzerin pc01,pc02,pc03,pc04,pc05,pc06,pc07,pc08,pc09,pc10
cscript //nologo C:\Scripts\SetLoginWS.vbs Benutzer1,Benutzerin2 pc01
cscript //nologo C:\Scripts\SetLoginWS.vbs /U:D:\BenutzerInnen.txt pc01,pc02,pc03,pc04,pc05,pc06,pc07,pc08,pc09,pc10
cscript //nologo C:\Scripts\SetLoginWS.vbs Benutzer /C:D:\Workstations.txt
cscript //nologo C:\Scripts\SetLoginWS.vbs Benutzerin1,Benutzer2,Benutzerin3 /C:D:\Workstations.txt
cscript //nologo C:\Scripts\SetLoginWS.vbs /U:D:\BenutzerInnen.txt /C:D:\Workstations.txt
cscript //nologo C:\Scripts\SetLoginWS.vbs Benutzerin1,Benutzerin2 "" 

Eine Workstationangabe "" bedeutet, dass eine Anmeldung an allen Workstations wieder erlaubt wird.

Schließlich soll auch die Variante "individuelle Liste von Workstations je BenutzerIn" nicht vergessen werden:
cscript //nologo C:\Scripts\SetLoginWS.vbs /UC:"D:\B und W.txt" 
Hierzu muss die übergebene Datei (im Beispiel "D:\B und W.txt") zeilenweise wie folgt aufgebaut sein:
BenutzerIn;Workstation[,Workstation]

Soferne die Domäne vorgegeben werden soll, kann dies durch die erste "Const"-Zeile erreicht werden (Kommentarzeichen entfernen nicht vergessen face-wink), ansonsten wird in der aktuellen Domäne gesucht.

Noch ein Hinweis: Da mehrere Argumente zu übergeben sind, wird der Aufruf ohnehin über CMD (direkt an der Kommandozeile oder als Batch) erfolgen - insofern bietet es sich an, "cscript" zu verwenden, nicht zuletzt, da sich so die Ausgaben auch leicht in eine Log-Datei umleiten lassen.

Grüße
bastla

P.S.: Die Idee zu dieser "Flexibilisierung" ist mir gekommen, als ich mich fragte, warum Du nur (exakt) ein Argument zulassen wolltest (if args.Count=1 then) - alle weiteren hättest Du ja einfach ignorieren können ...