Det kan man godt.
' whs-script til brugeroprettelser på win2000 server ud fra netstudieudtrækket fra gas NY
' Søren Aagaard
' ITC københavns amt
' juli 2003
' version 1.3
dim dicini, aItems, aKeys, i
set dicini = parseINI("c:\administration\brugeradm\server.ini")
aItems = dicini.items
aKeys = dicini.keys
root = replace(aItems(0) & "",chr(34),"")
rod_drev_p=replace(aItems(1) & "",chr(34),"")
bruger_rod_p=replace(aItems(2) & "",chr(34),"")
rod_drev_e=replace(aItems(3) & "",chr(34),"")
bruger_rod_e=replace(aItems(4) & "",chr(34),"")
sDomain=replace(aItems(5) & "",chr(34),"")
sServer=replace(aItems(6) & "",chr(34),"")
share_navn=replace(aItems(7) & "",chr(34),"")
pwtype=replace(aItems(8) & "",chr(34),"")
pwlength=replace(aItems(9) & "",chr(34),"")
oup=replace(aItems(10) & "",chr(34),"")
ouk=replace(aItems(11) & "",chr(34),"")
plog=replace(aItems(12) & "",chr(34),"")
slog=replace(aItems(13) & "",chr(34),"")
profiltype=replace(aItems(14) & "",chr(34),"")
profilmappe=replace(aItems(15) & "",chr(34),"")
tsprofilmappe = replace(aItems(16) & "",chr(34),"")
pershare = replace(aItems(17) & "",chr(34),"")
root = replace(root & "",chr(32),"")
rod_drev_p=replace(rod_drev_p & "",chr(32),"")
bruger_rod_p=replace(bruger_rod_p & "",chr(32),"")
rod_drev_e=replace(rod_drev_e & "",chr(32),"")
bruger_rod_e=replace(bruger_rod_e & "",chr(32),"")
sDomain=replace(sDomain & "",chr(32),"")
sServer=replace(sServer & "",chr(32),"")
share_navn=replace(share_navn & "",chr(32),"")
pwtype=replace(pwtype & "",chr(32),"")
pwlength=replace(pwlength & "",chr(32),"")
oup=replace(oup & "",chr(32),"")
ouk=replace(ouk & "",chr(32),"")
plog=replace(plog & "",chr(32),"")
slog=replace(slog & "",chr(32),"")
profiltype=replace(profiltype & "",chr(32),"")
profilmappe=replace(profilmappe & "",chr(32),"")
tsprofilmappe=replace(tsprofilmappe & "",chr(32),"")
pershare=replace(pershare & "",chr(32),"")
' dimensionering af variable
on error resume next
Set oDomain = getObject("
WinNT://" & sDomain)
oDomain.Filter = array("User")
dim filesys
Set filesys = Wscript.CreateObject("Scripting.FileSystemObject")
Set fso = CreateObject("Scripting.FileSystemObject")
Set WshShell = Wscript.CreateObject("Wscript.Shell")
dim start, slut
dim oxl
dim status
dim u
dim u1
dim c
dim root
dim textxla
dim StiTilFil
dim crlf
dim oargs
dim pword, pwtype, pwlength
dim sfolderpath
dim ok
dim findes, log, meddel
dim oUser
'dimensionering af tegnkonstanter (anførselstegn og kolon)
anf=chr(34)
col=chr(58)
ok = 0
findes = 0
crlf = chr(13) & chr(10)
Set shell=Wscript.CreateObject("Wscript.shell")
StiTilFil = "c:\administration\brugeradm\samlet.txt"
on error resume next
'indlæsning og aktivering af serverdata
'*************************************************************
meddel = WshShell.Popup("Brugeroprettelsen er igang. En sammenfatning vil dukke op når den er færdig." , 7, "ITC Brugeroprettelse", 0 + 64)
start = Timer
' hvis der stilles krav om passwordlængde og passwordtypen er sat til 1 nulstilles kravet midlertidigt
if pwtype = "1" and pwlength > 0 then
shell.run "net accounts /minpwlen:0"
end if
wscript.sleep 100
'*************************************************************
'indlæsning og aktivering af brugerdata fra tekstfil
'*************************************************************
Set fso = CreateObject("Scripting.FileSystemObject")
Set tsinputfile = fso.OpenTextFile(StiTilFil, 1, False)
While Not tsinputfile.AtEndOfStream ' kør i en løkke til der ikke er mere tekst i filen.
strLine = tsinputfile.ReadLine
arrInput = Split(strLine, ",")
arrInput(0)=replace(arrInput(0),chr(34),"") 'institutionskode
instkode = arrInput(0)
arrInput(1)=replace(arrInput(1),chr(34),"") 'kode 1 eller 2
typekode = arrInput(1)
arrInput(2)=replace(arrInput(2),chr(34),"") 'login
log = arrInput(2)
arrInput(3)=replace(arrInput(3),chr(34),"") 'hashkode
passw = arrInput(3)
passw = Right(passw,4)
arrInput(4)=replace(arrInput(4),chr(34),"") 'fornavn
fornavn = arrInput(4)
arrInput(5)=replace(arrInput(5),chr(34),"") 'efternavn
efternavn = arrInput(5)
fuldenavn = fornavn & " " & efternavn
valg = typekode
if valg=1 then
ou1 = ouk
bruger_rod = bruger_rod_e
rod_drev = rod_drev_e
sti = slog
status = bruger_rod_e
antistatus = bruger_rod_p
else
ou1 = oup
bruger_rod = bruger_rod_p
rod_drev = rod_drev_p
sti = plog
status = bruger_rod_p
antistatus = bruger_rod_e
end if
beskriv = status & " " & fuldenavn
sfolderpath=rod_drev+bruger_rod +"\"+ log 'brugermappenavn
set logg = Nothing
On Error Resume Next
set logg = GetObject("
WinNT://"+sDomain+"/"+log+",user")
if logg Is Nothing then
ok = ok + 1
s1 = ou1+"," + root
s = "
LDAP://" + s1
Set c = GetObject(s)
uname = "CN=" + log ' commonname sættes til samaccountname
uname = "CN=" + log
Set u = c.Create("user", uname)
uname1 = "
LDAP://" + uname + "," + s1
set u=GetObject(uname1)
'her sættes kontoegenskaberne
' ***************************************************
u.Put "givenName", fornavn 'fornavn
u.Put "sn", efternavn 'efternavn
u.Put "displayName", fuldenavn 'fulde navn
' u.Put "fullname", fuldenavn 'fulde navn
u.Put"description", beskriv 'så de er lettere at kende i ad
u.Put "sAMAccountName", log 'samaccountnavn
u.Put "scriptPath",sti 'logonscript
u.Put "homeDrive", + share_navn+col ' navn på personligt drev (p:)
u.Put "homeDirectory","\\" + sserver + "\" + log +"$"
u.Put "userPrincipalName", log 'brugers logonnavn = samaccountnavn
if len(profilmappe) > 2 then
if profiltype = "M" or profiltype = "m" then
u.Put "profilePath", profilmappe
end if
if profiltype = "R" or profiltype = "r" then
u.Put "profilePath", profilmappe & "\" & log
end if
end if
' her indlæses password fra regneark eller sættes med et standard password
'***************************************************
' »useraccountcontrol« værdierne:
'16 = brugeren skal ændre password ved næste logon,
'64 = brugeren kan ikke ændre password,
'66048 = brugerens password udløber aldrig, kan ændres.
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if pwtype = 1 then
u.Put "userAccountControl",16
end if
if pwtype = 2 then ' sat ud af kraft i denne version
kode =right(hash, 4) ' bruger de sidste fire cifre af hashkode som password
pword=(kode)
u.Put "userAccountControl",66048
u.Setinfo
u.Setpassword(pword)
end if
'***************************************************
u.Setinfo
Set u = nothing
addusertogroup oDomain, log,status
' Lav en mappe til brugeren
fso.CreateFolder sfolderpath
'get the file service object
Set objFileService = GetObject("
WinNT://" & sServer & "/LanmanServer")
sharesom = log & "$"
Set objFileShare = objFileService.create("FileShare", sharesom)
objFileShare.Path = sfolderpath
objFileShare.Description = fuldenavn
objFileShare.MaxUserCount = -1 'set unlimited users
objFileShare.SetInfo
brufull = "wscript.exe c:\administration\brugeradm\aclchange.vbs " + anf + sfolderpath + anf +" "+sDomain+"\"+ log
WshShell.run brufull , 1, true
fso.CreateFolder sfolderpath+"\Dokumenter"
fso.CreateFolder sfolderpath+"\Dokumenter\My Pictures"
fso.CreateFolder sfolderpath+"\Skrivebord"
if len(profilmappe) > 1 then
if profiltype = "R" or profiltype = "r" then
filesys.CreateFolder profilmappe & "\" & log
end if
if profiltype = "M" or profiltype = "m" then
filesys.CreateFolder profilmappe
end if
end if
if len(tsprofilmappe) > 2 then
filesys.CreateFolder tsprofilmappe & "\" & log
end if
if len(pershare) > 1 then
if typekode =2 then
pubsti = pershare+"\"+log+"-udbakke"
pristi = pershare+"\"+log+"-indbakke"
filesys.CreateFolder pubsti
filesys.CreateFolder pristi
usrname = sDomain+"\"+antistatus
pubfull = "wscript.exe c:\administration\brugeradm\aclfull.vbs "+ pubsti+" "+sDomain+"\"+ log
prifull = "wscript.exe c:\administration\brugeradm\aclfull.vbs "+pristi+" "+sDomain+"\"+ log
read = "wscript.exe c:\administration\brugeradm\aclread.vbs "+pubsti+" "+ usrname
write = "wscript.exe c:\administration\brugeradm\aclwrite.vbs "+ pristi+" "+ usrname
WshShell.run read , 1, true
WshShell.run write , 1, true
WshShell.run pubfull , 1, true
WshShell.run prifull , 1, true
end if
end if
if len(tsprofilmappe) > 2 then
Set WshShell = wscript.CreateObject("wscript.shell")
WshShell.run "\\" & sserver & "\admin$\system32\tsprof /update /local /profile:" & tsprofilmappe & "\" & log & " " & log
end if
sfolderpath = nothing
else
findes = findes+1
end if
wend
' __________________________________________________________________
if pwtype = "1" and pwlength > 0 then ' reglen om passwordlængde genoprettes
shell.run "net accounts /minpwlen:" + pwlength
end if
slut = Timer
brugt = slut-start
minutter = int(brugt/60)
sekunder = int(brugt-(minutter*60))
if minutter = 0 then
txtm=""
txts = sekunder & " sekunder"
end if
if minutter = 1 then
txtm="1 minut og "
txts = sekunder & " sekunder"
end if
if minutter > 1 then
txtm= minutter & " minutter og "
txts = sekunder & " sekunder"
end if
ok = ok-1
gns = brugt/ok
gns = gns*10
gns = int(gns)
gns = gns/10
tekst = "ITC brugeroprettelse udført." & vbcrlf & vbcrlf & ok & " brugere blev oprettet."
tekst = tekst & vbcrlf & vbcrlf & findes & " brugere var allerede oprettet."&vbcrlf & vbcrlf
tekst = tekst & "Tid: " & txtm & txts & vbcrlf
tekst = tekst & "Gns pr bruger: " & gns & " sekunder" & vbcrlf
wscript.echo tekst
Function parseINI(sIniFilename)
on error resume next
Dim fso, tsIni, iEquals, sKey, sVal
Set parseINI = Wscript.CreateObject("Scripting.Dictionary")
Set fso = Wscript.CreateObject("Scripting.FileSystemObject")
Set tsIni = fso.openTextFile(sIniFilename)
Do while not tsIni.AtEndOfStream
sLine = Trim(tsIni.ReadLine)
If sLine <> "" Then
If Left(sLine, 1) = "'" Then
Else
iEquals = InStr(1, sLine, "=")
If (iEquals <=1) Then
Wscript.Echo "Ugyldig linie: " & sLine
Else
sKey = Left(sLine, iEquals - 1)
sVal = Right(sLine, Len(sLine) - iEquals)
parseINI.Add sKey, sVal
End if
End if
End if
Loop
End Function
Sub AddUserToGroup(strDomain,strUsername,strGroupname)
Dim User
Dim Group
Set User = GetObject("
WinNT://" & sDomain & "/" & log & ",user")
Set Group = GetObject("
WinNT://" & sDomain & "/" & bruger_rod & ",group")
Group.Add(User.ADsPath)
Group.Setinfo
Set User = nothing
Set Group = nothing
End Sub
Function UserExists(user)
result=false
tmp=mid(getAdsPath(user,"samAccountName", "user","","subtree",true,true,false),1,5)
if not tmp="error" then
result=true
end if
UserExists= result
End Function
Function getADsPath(name, nameproperty, oclass, oustr, scope, ldap, showdc, parent)
'errorcheck
if not ( _
(oclass="computer" or oclass="contact" or _
oclass="organizationalUnit" or _
oclass="group" or oclass="user") _
and _
(scope="base" or scope="oneLevel" or scope="subtree") _
) then
getAdsPath="error: bad objectclass or scope"
exit function
end if
Const adStateOpen = 1
Dim adoConnection
dim adoRecordset
Set adoConnection = CreateObject("ADODB.Connection")
adoConnection.Provider = "AdsDSOObject"
adoConnection.Open "", ADUSER & "," & _
DCSTR, PASSWORD
if not adoConnection.State = adStateOpen Then
Wscript.Echo "Authentication Failed."
Wscript.Quit(1)
end if
tmpoustr=oustr
if not tmpoustr="" then tmpoustr=tmpoustr & ","
execstring ="<
LDAP://" & tmpoustr & DCSTR & ">;" & "(&(" & nameproperty & "=" & name & ")" & "(objectClass=" & oclass & "));" & "AdsPath;" & scope
Set adoRecordset = adoConnection.Execute (execstring)
result=""
haveResult=false
while not adoRecordset.EOF
if haveResult then
getADsPath="error:more than one result"
exit function
end if
result = adoRecordset.Fields.Item("ADsPath").Value
haveResult=true
adoRecordset.MoveNext
wend
adoConnection.Close
Set adoRecordset = Nothing
if not haveResult then result = "error: no results"
if parent then
Set o = GetObject(result)
Set p = GetObject(o.Parent)
result = "
LDAP://" & p.get("distinguishedName")
end if
if not ldap then
Set o = getObject(result)
result = o.get("distinguishedName")
end if
if not showdc then
result = mid(result,1,instr(result,"DC=")-2)
end if
getAdsPath = result
End Function
Server.ini:
root = DC=NAG,DC=KAUV,DC=DK
rod_drev_p = "E:\"
bruger_rod_p = "Personale"
rod_drev_e = "E:\"
bruger_rod_e = "Elever"
sDomain = "nag.kauv.dk"
sServer = "Oskar"
share_navn = "P"
pwtype = 1
pwlength = 2
oup = "OU=Personale,OU=Brugere"
ouk = "OU=Elever,OU=Brugere"
plog = p-logon.bat
slog = e-logon.bat
profiltype =
profilmappe =
tsprofilmappe =
pershare =
samlet.txt:
"Skolens navn eller lignende","Denne linie bruges ikke"
"1","13167","","Birte","Petersen","050104-2050104-2","090285"
"2","LJ","","Lars","Jørgensen",",050104-2050104-2,","260256"
Forklaring:
Felt 1: 1 betyder elev, 2 betyder lærer
Felt 2: Login
Fe