1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
6:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332:
333:
334:
335:
336:
337:
338:
339:
340:
341:
342:
343:
344:
|
const ROOT_OU = „cn=users“
const REPOSITORY_FILE = „c:\temp\repository.log“
const REPOSITORY_COMPARE_FILE = „c:\temp\repository _comp.log“
const RESULT_FILE = „c:\temp\result.log“
const USER_PROPS = „Name, AccountDisabled, AccountExpirationDate, GroupMembership“
usersPropsDict = CreateObject („Scripting.Dictionary“) einstellen
objFSO = createobject („scripting.filesystemobject“) einstellen
GetUsersProps
wenn objFSO.FileExists (REPOSITORY_FILE) dann
objFSO.CopyFile REPOSITORY_FILE, REPOSITORY_COMPARE_FILE, ZUTREFFEND
LogUsersProps
CheckUserChanges
sonst
LogUsersProps
beenden wenn
wscript.echo „schließen“ ab
Funktion CheckUsersStatus (prevStateArr, curStateArr)
schwaches strResult
usersDict = CreateObject („Scripting.Dictionary“) einstellen
für jede Linie im prevStateArr
wenn Ordnung (Linie) <> "" dann
Benutzer = spaltete auf sich (Linie, „, ") (0)
usersDict.Add Benutzer, 0
beenden wenn
zunächst
für jede Linie im curStateArr
wenn Ordnung (Linie) <> "" dann
Benutzer = spaltete auf sich (Linie, „, ") (0)
wenn usersDict.Exists (Benutzer) dann
usersDict.Item (Benutzer) = 2
sonst
usersDict.Add Benutzer, 1
beenden wenn
beenden wenn
zunächst
für jeden Schlüssel im usersDict
Fall usersDict.Item (Schlüssel) vorwählen
Rechtssache 0: 'Benutzer wurde gelöscht
strResult = strResult u. „Benutzer [“ u. Schlüssel u. „] wurden“ u. vbNewLine gelöscht
Rechtssache 1: 'neuer hergestellter Benutzer
strResult = strResult u. „neuer Benutzer [“ u. Schlüssel u. „] wurden“ u. vbNewLine verursacht
Rechtssache 2: 'Benutzer wurde nicht geändert
Ende auserwählt
zunächst
CheckUsersStatus = strResult
Endenfunktion
VorCheckUserChanges
curStateData = objFSO.OpenTextFile (REPOSITORY_FILE, 1).ReadAll
prevStateData = objFSO.OpenTextFile (REPOSITORY_COMPARE_FILE, 1).ReadAll
curStateArr = spaltete auf sich (curStateData, vbNewLine)
prevStateArr = spaltete auf sich (prevStateData, vbNewLine)
strSubject = „ANZEIGE Benutzer ändert Resultats-Maschinenbordbuch -“ u. Datum u. „„u. Zeit
strResult = CheckUsersStatus (prevStateArr, curStateArr)
für i=1 zu UBound (curStateArr)
Linie = curStateArr (i)
wenn InStr (prevStateData, trimmen (Linie) u. vbNewLine), = 0 dann
matchLine = FindUserChangeDelta (Linie, prevStateArr)
wenn matchLine <> "" dann
changeResult = LogUserPropertiesChange (matchLine, Linie)
wenn changeResult <> "" dann
strResult = strResult u. changeResult
beenden wenn
beenden wenn
beenden wenn
zunächst
wenn objFSO.FileExists (RESULT_FILE) dann
gesetztes objResFile = objFSO.OpenTextFile (RESULT_FILE, 8)
sonst
gesetztes objResFile = objFSO.CreateTextFile (RESULT_FILE, 2)
beenden wenn
objResFile.WriteLine strSubject
wenn strResult <> "" dann
objResFile.WriteLine strResult
NotifyByEmail strSubject, strResult
sonst
objResFile.WriteLine „keine Änderungen wurden überwacht.“
beenden wenn
objResFile.Close
Unterseeboot beenden
sub NotifyByEmail (strSubject, strResult)
ToAddress verdunkeln
MessageSubject verdunkeln
MessageBody verdunkeln
MessageAttachment verdunkeln
Ol, ns, newMail verdunkeln
ToAddress = „[email protected]“
MessageSubject = strSubject
MessageBody = strResult
Ol = WScript.CreateObject („Outlook.Application“) einstellen
Einstellen ns = ol.getNamespace („MAPI“)
ns.log auf "", "", zutreffend, falsch
newMail = ol.CreateItem (olMailItem) einstellen
newMail.Subject = MessageSubject
newMail.Body = MessageBody u. vbCrLf
'die Empfänger, gerade im Fall validieren…
myRecipient einstellen = ns.CreateRecipient (ToAddress)
myRecipient.Resolve
Wenn nicht myRecipient.Resolved dann
MsgBox „unbekannte Empfänger“
Sonst
newMail.Recipients.Add (myRecipient)
newMail.Send
Beenden wenn
Ol einstellen = nichts
Unterseeboot beenden
Funktion LogUserPropertiesChange (matchLine, Linie)
changeResult = falsch
arr1 = spaltete auf sich (matchLine, „, ")
arr2 = spaltete auf sich (Linie, „, ")
userPropsArr = spaltete auf sich (USER_PROPS, „, ")
strResult = „[“ u. arr1 (0) u. „]“ u. vbNewLine
für i=1 zu UBound (userPropsArr)
'spezielle Behandlung für GroupMembership
wenn userPropsArr (i) = „GroupMembership“ dann
wenn UBound (arr1) < i="" then="" strResult="strResult">= i und UBound (arr2) >= I dann
wenn arr1 (i) <> arr2 (i) dann
strLine = userPropsArr (i) u. „: “ u. vbNewLine
strLine = strLine u. „vor =“ u. arr1 (i) u. vbNewLine
strLine = strLine u. „nach =“ u. arr2 (i) u. vbNewLine
strResult = strResult u. strLine u. vbNewLine
changeResult = richten aus
beenden wenn
sonst
wenn UBound (arr1) >= I und UBound (arr2) < i="" then="" strLine="userPropsArr(i)">= i dann
strLine = userPropsArr (i) u. „: “ u. vbNewLine
strLine = strLine u. „vor = kein Eigentum“ u. vbNewLine
strLine = strLine u. „nach =“ u. arr2 (i) u. vbNewLine
strResult = strResult u. strLine u. vbNewLine
changeResult = richten aus
beenden wenn
beenden wenn
beenden wenn
beenden wenn
zunächst
wenn changeResult = dann ausrichten
LogUserPropertiesChange = strResult u. vbNewLine
sonst
LogUserPropertiesChange = ""
beenden wenn
Funktion beenden
Funktion FindUserChangeDelta (Linie, prevStateArr)
schwacher Benutzer, matchLine
Benutzer = spaltete auf sich (Linie, „, ") (0)
für jedes prevLine im prevStateArr
wenn Ordnung (prevLine) <> "" dann
wenn Spalte (prevLine, „, ") (0) = Benutzer dann
matchLine = prevLine
für herausnehmen
beenden wenn
beenden wenn
zunächst
FindUserChangeDelta = matchLine
Endenfunktion
VorLogUsersProps
auf Störungszusammenfassung zunächst
schwaches userProp
objLog = objFSO.CreateTextFile (REPOSITORY_FILE, 2) einstellen
objLog.WriteLine USER_PROPS
für jedes objKey im usersPropsDict
userProp = objKey
für jedes objInnerKey im usersPropsDict (objKey)
userProp = userProp u. „,“ u. usersPropsDict (objKey) (objInnerKey)
zunächst
objLog.WriteLine userProp
zunächst
objLog.Close
Endenunterseeboot
VorGetUsersProps
schwacher Benutzer
Const ADS_SCOPE_SUBTREE = 2
objConnection = CreateObject („ADODB.Connection“) einstellen
objCommand = CreateObject („ADODB.Command“) einstellen
objConnection.Provider = „ADsDSOObject“
objConnection.Open „aktiver Verzeichnis-Versorger“
Einstellen objCommand.ActiveConnection = objConnection
objCommand.Properties („Seiten-Größe“) = 1000
objCommand.Properties („Searchscope“) = ADS_SCOPE_SUBTREE
objRootDSE = GetObject einstellen („LDAP: //RootDSE“)
strDNSDomain = objRootDSE.Get („defaultNamingContext“)
wenn ROOT_OU <> "" dann
ldaproot = „LDAP: /“ u. ROOT_OU u. „,“ u. strDNSDomain
sonst
ldaproot = „LDAP: /“ u. strDNSDomain
beenden wenn
objCommand.CommandText = „AUSERWÄHLTES distinguishedName, sAMAccountName VON „“ u. ldaproot u. „“ WO objectCategory='user'"
objRecordSet = objCommand.Execute einstellen
Während nicht objRecordSet.EOF
Benutzer = objRecordSet.Fields („sAMAccountName“). Wert
wenn usersPropsDict.Exists (Benutzer) = falsch dann
auf Störungszusammenfassung zunächst
propsDict = CreateObject („Scripting.Dictionary“) einstellen
usersPropsDict.Add Benutzer, propsDict
ObjUser = GetObject einstellen („LDAP: /“ u. objRecordSet.Fields („distinguishedName“). Wert)
propsDict.Add „AccountDisabled“, ObjUser.AccountDisabled
propsDict.Add „AccountExpirationDate“, ObjUser.AccountExpirationDate
beenden wenn
objRecordSet.MoveNext
WEnd
getUsersGroups
Endenunterseeboot
VorgetUsersGroups
schwache Gruppe
Const ADS_SCOPE_SUBTREE = 2
objConnection = CreateObject („ADODB.Connection“) einstellen
objCommand = CreateObject („ADODB.Command“) einstellen
objConnection.Provider = „ADsDSOObject“
objConnection.Open „aktiver Verzeichnis-Versorger“
Einstellen objCommand.ActiveConnection = objConnection
objCommand.Properties („Seiten-Größe“) = 1000
objCommand.Properties („Searchscope“) = ADS_SCOPE_SUBTREE
objRootDSE = GetObject einstellen („LDAP: //RootDSE“)
strDNSDomain = objRootDSE.Get („defaultNamingContext“)
wenn ROOT_OU <> "" dann
ldaproot = „LDAP: /“ u. ROOT_OU u. „,“ u. strDNSDomain
sonst
ldaproot = „LDAP: /“ u. strDNSDomain
beenden wenn
objCommand.CommandText = „AUSERWÄHLTES distinguishedName, sAMAccountName VON „“ u. ldaproot u. „“ WO objectCategory='group'"
objRecordSet = objCommand.Execute einstellen
Während nicht objRecordSet.EOF
Gruppe = objRecordSet.Fields („distinguishedName“). Wert
ObjGroup = GetObject einstellen („LDAP: /“ u. Gruppe)
für jedes objMember in objGroup.Members
wenn usersPropsDict.Exists (objmember.samaccountname) dann
wenn usersPropsDict.Item (objmember.samaccountname). Existiert („groupMembership“) dann
groupMembership = usersPropsDict.Item (objmember.samaccountname). Einzelteil („groupMembership“)
groupMembership = groupMembership u. „; “ u. objGroup.samaccountname
usersPropsDict.Item (objmember.samaccountname). Einzelteil („groupMembership“) = groupMembership
sonst
usersPropsDict.Item (objmember.samaccountname). „groupMembership“ addieren, objGroup.samaccountname
beenden wenn
beenden wenn
zunächst
objRecordSet.MoveNext
WEnd
Unterseeboot beenden
|