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!"
Please also mark the comments that contributed to the solution of the article
Content-Key: 79609
Url: https://administrator.de/contentid/79609
Printed on: May 4, 2024 at 16:05 o'clock
1 Comment
Hallo hawaiixxx!
Etwas flexibler wäre es so:
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:
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:
Hierzu muss die übergebene Datei (im Beispiel "D:\B und W.txt") zeilenweise wie folgt aufgebaut sein:
Soferne die Domäne vorgegeben werden soll, kann dies durch die erste "Const"-Zeile erreicht werden (Kommentarzeichen entfernen nicht vergessen ), 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 ...
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
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"
BenutzerIn;Workstation[,Workstation]
Soferne die Domäne vorgegeben werden soll, kann dies durch die erste "Const"-Zeile erreicht werden (Kommentarzeichen entfernen nicht vergessen ), 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 ...