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:
36:
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 = «имя, AccountDisabled, AccountExpirationDate, GroupMembership»
Установите usersPropsDict = CreateObject («Scripting.Dictionary»)
установите objFSO = createobject («scripting.filesystemobject»)
GetUsersProps
если objFSO.FileExists (REPOSITORY_FILE) после этого
objFSO.CopyFile REPOSITORY_FILE, REPOSITORY_COMPARE_FILE, ПОИСТИНЕ
LogUsersProps
CheckUserChanges
еще
LogUsersProps
закончитесь если
wscript.echo «завершают»
функция CheckUsersStatus (prevStateArr, curStateArr)
тусклое strResult
Установите usersDict = CreateObject («Scripting.Dictionary»)
для каждой линии в prevStateArr
если "" уравновешивания (линии <> ) после этого
потребитель = разделил (линия, «, ") (0)
потребитель usersDict.Add, 0
закончитесь если
затем
для каждой линии в curStateArr
если "" уравновешивания (линии <> ) после этого
потребитель = разделил (линия, «, ") (0)
если usersDict.Exists (потребитель) после этого
usersDict.Item (потребитель) = 2
еще
потребитель usersDict.Add, 1
закончитесь если
закончитесь если
затем
для каждого ключа в usersDict
выберите случай usersDict.Item (ключ)
случай 0: 'потребитель был уничтожен
были уничтожены strResult = strResult & «потребитель [» & ключ & «]» & vbNewLine
случай 1: 'новый созданный потребитель
были созданы strResult = strResult & «новый потребитель [» & ключ & «]» & vbNewLine
случай 2: 'потребитель не был изменен
конец отборный
затем
CheckUsersStatus = strResult
функция конца
sub CheckUserChanges
curStateData = objFSO.OpenTextFile (REPOSITORY_FILE, 1).ReadAll
prevStateData = objFSO.OpenTextFile (REPOSITORY_COMPARE_FILE, 1).ReadAll
curStateArr = разделило (curStateData, vbNewLine)
prevStateArr = разделило (prevStateData, vbNewLine)
strSubject = «потребитель ОБЪЯВЛЕНИЯ изменяет журнал результата -» & дату & ««& время
strResult = CheckUsersStatus (prevStateArr, curStateArr)
для i=1 к UBound (curStateArr)
линия = curStateArr (I)
если InStr (prevStateData, уравновешивает (линия) & vbNewLine) = 0 после этого
matchLine = FindUserChangeDelta (линия, prevStateArr)
если "" <> matchLine после этого
changeResult = LogUserPropertiesChange (matchLine, линия)
если "" <> changeResult после этого
strResult = strResult & changeResult
закончитесь если
закончитесь если
закончитесь если
затем
если objFSO.FileExists (RESULT_FILE) после этого
установленное objResFile = objFSO.OpenTextFile (RESULT_FILE, 8)
еще
установленное objResFile = objFSO.CreateTextFile (RESULT_FILE, 2)
закончитесь если
strSubject objResFile.WriteLine
если "" <> strResult после этого
strResult objResFile.WriteLine
strSubject NotifyByEmail, strResult
еще
были проконтролированы objResFile.WriteLine «никакие изменения.»
закончитесь если
objResFile.Close
закончите подводную лодку
sub NotifyByEmail (strSubject, strResult)
Затемните ToAddress
Затемните MessageSubject
Затемните MessageBody
Затемните MessageAttachment
Затемните ol, ns, newMail
ToAddress = «[email protected]»
MessageSubject = strSubject
MessageBody = strResult
Установите ol = WScript.CreateObject («Outlook.Application»)
Установите ns = ol.getNamespace («MAPI»)
ns.log на "", "", поистине, ложном
Установите newMail = ol.CreateItem (olMailItem)
newMail.Subject = MessageSubject
newMail.Body = MessageBody & vbCrLf
'утвердите получатель, как раз в случае…
Установите myRecipient = ns.CreateRecipient (ToAddress)
myRecipient.Resolve
Если не myRecipient.Resolved после этого
MsgBox «неизвестный получатель»
Еще
newMail.Recipients.Add (myRecipient)
newMail.Send
Закончитесь если
Установите ol = ничего
закончите подводную лодку
функция LogUserPropertiesChange (matchLine, линия)
changeResult = ложно
arr1 = разделило (matchLine, «, ")
arr2 = разделило (линия, «, ")
userPropsArr = разделило (USER_PROPS, «, ")
strResult = «[» & arr1 (0) & «]» & vbNewLine
для i=1 к UBound (userPropsArr)
'специальный регулировать для GroupMembership
если userPropsArr (I) = «GroupMembership» после этого
если UBound (arr1) < i="" then="" strResult="strResult">= I и >= iий UBound (arr2) после этого
если arr1 (I) <> arr2 (I) после этого
strLine = userPropsArr (I) & «: » & vbNewLine
strLine = strLine & «перед =» & arr1 (I) & vbNewLine
strLine = strLine & «после =» & arr2 (I) & vbNewLine
strResult = strResult & strLine & vbNewLine
changeResult = true
закончитесь если
еще
если >= iий UBound (arr1) и UBound (arr2) < i="" then="" strLine="userPropsArr(i)">= I после этого
strLine = userPropsArr (I) & «: » & vbNewLine
strLine = strLine & «перед = отсутствие свойства» & vbNewLine
strLine = strLine & «после =» & arr2 (I) & vbNewLine
strResult = strResult & strLine & vbNewLine
changeResult = true
закончитесь если
закончитесь если
закончитесь если
закончитесь если
затем
если changeResult = true после этого
LogUserPropertiesChange = strResult & vbNewLine
еще
LogUserPropertiesChange = ""
закончитесь если
закончите функцию
функция FindUserChangeDelta (линия, prevStateArr)
тусклый потребитель, matchLine
потребитель = разделил (линия, «, ") (0)
для каждого prevLine в prevStateArr
если "" уравновешивания (prevLine <> ) после этого
если разделение (prevLine, «, ") (0) = потребитель после этого
matchLine = prevLine
выходите для
закончитесь если
закончитесь если
затем
FindUserChangeDelta = matchLine
функция конца
sub LogUsersProps
на резюме ошибки затем
тусклое userProp
установите objLog = objFSO.CreateTextFile (REPOSITORY_FILE, 2)
objLog.WriteLine USER_PROPS
для каждого objKey в usersPropsDict
userProp = objKey
для каждого objInnerKey в usersPropsDict (objKey)
userProp = userProp & «,» & usersPropsDict (objKey) (objInnerKey)
затем
userProp objLog.WriteLine
затем
objLog.Close
подводная лодка конца
sub GetUsersProps
тусклый потребитель
Const ADS_SCOPE_SUBTREE = 2
Установите objConnection = CreateObject («ADODB.Connection»)
Установите objCommand = CreateObject («ADODB.Command»)
objConnection.Provider = «ADsDSOObject»
objConnection.Open «активно провайдер директории»
Установите objCommand.ActiveConnection = objConnection
objCommand.Properties («размер страницы») = 1000
objCommand.Properties («Searchscope») = ADS_SCOPE_SUBTREE
Установите objRootDSE = GetObject («LDAP: //RootDSE»)
strDNSDomain = objRootDSE.Get («defaultNamingContext»)
если "" <> ROOT_OU после этого
ldaproot = «LDAP: /» & ROOT_OU & «,» & strDNSDomain
еще
ldaproot = «LDAP: /» & strDNSDomain
закончитесь если
objCommand.CommandText = «ОТБОРНОЕ distinguishedName, sAMAccountName ОТ «» & ldaproot & «» ГДЕ objectCategory='user'"
Установите objRecordSet = objCommand.Execute
Пока не objRecordSet.EOF
потребитель = objRecordSet.Fields («sAMAccountName»). Значение
если usersPropsDict.Exists (потребитель) = ложно после этого
на резюме ошибки затем
Установите propsDict = CreateObject («Scripting.Dictionary»)
потребитель usersPropsDict.Add, propsDict
Установите ObjUser = GetObject («LDAP: /» & objRecordSet.Fields («distinguishedName»). Значение)
propsDict.Add «AccountDisabled», ObjUser.AccountDisabled
propsDict.Add «AccountExpirationDate», ObjUser.AccountExpirationDate
закончитесь если
objRecordSet.MoveNext
WEnd
getUsersGroups
подводная лодка конца
sub getUsersGroups
тусклая группа
Const ADS_SCOPE_SUBTREE = 2
Установите objConnection = CreateObject («ADODB.Connection»)
Установите objCommand = CreateObject («ADODB.Command»)
objConnection.Provider = «ADsDSOObject»
objConnection.Open «активно провайдер директории»
Установите objCommand.ActiveConnection = objConnection
objCommand.Properties («размер страницы») = 1000
objCommand.Properties («Searchscope») = ADS_SCOPE_SUBTREE
Установите objRootDSE = GetObject («LDAP: //RootDSE»)
strDNSDomain = objRootDSE.Get («defaultNamingContext»)
если "" <> ROOT_OU после этого
ldaproot = «LDAP: /» & ROOT_OU & «,» & strDNSDomain
еще
ldaproot = «LDAP: /» & strDNSDomain
закончитесь если
objCommand.CommandText = «ОТБОРНОЕ distinguishedName, sAMAccountName ОТ «» & ldaproot & «» ГДЕ objectCategory='group'"
Установите objRecordSet = objCommand.Execute
Пока не objRecordSet.EOF
группа = objRecordSet.Fields («distinguishedName»). Значение
Установите ObjGroup = GetObject («LDAP: /» & группа)
для каждого objMember в objGroup.Members
если usersPropsDict.Exists (objmember.samaccountname) после этого
если usersPropsDict.Item, то (objmember.samaccountname). Существует («groupMembership») после этого
groupMembership = usersPropsDict.Item (objmember.samaccountname). Деталь («groupMembership»)
groupMembership = groupMembership & «; » & objGroup.samaccountname
usersPropsDict.Item (objmember.samaccountname). Деталь («groupMembership») = groupMembership
еще
usersPropsDict.Item (objmember.samaccountname). Добавьте «groupMembership», objGroup.samaccountname
закончитесь если
закончитесь если
затем
objRecordSet.MoveNext
WEnd
закончите подводную лодку
|