SMTPReg.Vbs
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:17k
源码类别:

模拟服务器

开发平台:

C/C++

  1. 'THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT 
  2. 'WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, 
  3. 'INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES 
  4. 'OF MERCHANTABILITY AND/OR FITNESS FOR A  PARTICULAR 
  5. 'PURPOSE
  6. '------------------------------------------------------------------------------
  7. 'FILE DESCRIPTION: Script for registering for SMTP Protocol sinks. 
  8. '
  9. 'File Name: smtpreg.vbs
  10. '
  11. ' Copyright (c) Microsoft Corporation 1993-1999. All rights reserved.
  12. '------------------------------------------------------------------------------
  13. Option Explicit
  14. '
  15. '
  16. ' the OnArrival event GUID
  17. Const GUIDComCatOnArrival = "{ff3caa23-00b9-11d2-9dfb-00C04FA322BA}"
  18. ' the SMTP source type
  19. Const GUIDSourceType = "{FB65C4DC-E468-11D1-AA67-00C04FA345F6}"
  20. Const GUIDCat = "{871736c0-fd85-11d0-869a-00c04fd65616}"
  21. Const GUIDSources = "{DBC71A31-1F4B-11d0-869D-80C04FD65616}"
  22. ' the SMTP service display name.  This is used to key which service to
  23. ' edit
  24. Const szService = "smtpsvc"
  25. ' the event manager object.  This is used to communicate with the 
  26. ' event binding database.
  27. Dim EventManager
  28. Set EventManager = WScript.CreateObject("Event.Manager")
  29. '
  30. ' register a new sink with event manager
  31. '
  32. ' iInstance - the instance to work against
  33. ' szEvent - OnArrival
  34. ' szDisplayName - the display name for this new sink
  35. ' szProgID - the progid to call for this event
  36. ' szRule - the rule to set for this event
  37. '
  38. public sub RegisterSink(iInstance, szEvent, szDisplayName, szProgID, szRule)
  39. Dim SourceType
  40. Dim szSourceDisplayName
  41. Dim Source
  42. Dim Binding
  43. Dim GUIDComCat
  44. Dim PrioVal
  45. ' figure out which event they are trying to register with and set
  46. ' the comcat for this event in GUIDComCat
  47. select case LCase(szEvent)
  48. case "onarrival"
  49. GUIDComCat = GUIDComCatOnArrival
  50. case else
  51. WScript.echo "invalid event: " & szEvent
  52. exit sub
  53. end select
  54. ' enumerate through each of the registered instances for the SMTP source
  55. ' type and look for the display name that matches the instance display
  56. ' name
  57. set SourceType = EventManager.SourceTypes(GUIDSourceType)
  58. szSourceDisplayName = szService & " " & iInstance
  59. for each Source in SourceType.Sources
  60. if Source.DisplayName = szSourceDisplayName then
  61. ' we've found the desired instance.  now add a new binding
  62. ' with the right event GUID.  by not specifying a GUID to the
  63. ' Add method we get server events to create a new ID for this
  64. ' event
  65. set Binding = Source.GetBindingManager.Bindings(GUIDComCat).Add("")
  66. ' set the binding properties
  67. Binding.DisplayName = szDisplayName
  68. Binding.SinkClass = szProgID
  69. ' register a rule with the binding
  70. Binding.SourceProperties.Add "Rule", szRule
  71. ' register a priority with the binding
  72. PrioVal = GetNextPrio(Source, GUIDComCat)
  73. If PrioVal < 0 then
  74. WScript.Echo "assigning priority to default value (24575)"
  75. Binding.SourceProperties.Add "Priority", 24575
  76. else
  77. WScript.Echo "assigning priority (" & PrioVal & " of 32767)"
  78. Binding.SourceProperties.Add "Priority", PrioVal
  79. end if
  80. ' save the binding
  81. Binding.Save
  82. WScript.Echo "registered " & szDisplayName
  83. exit sub
  84. end if
  85. next
  86. end sub
  87. '
  88. ' iterate through the bindings in a source, find the binding
  89. ' with the lowest priority, and return the next priority value.
  90. ' If the next value exceeds the range, return -1.
  91. '
  92. public function GetNextPrio(oSource, GUIDComCat)
  93. ' it's possible that priority values will not be
  94. ' numbers, so we add error handling for this case
  95. on error resume next
  96. Dim Bindings
  97. Dim Binding
  98. Dim nLowestPrio
  99. Dim nPrioVal
  100. nLowestPrio = 0
  101. set Bindings = oSource.GetBindingManager.Bindings(GUIDComCat)
  102. ' if the bindings collection is empty, then this is the first
  103. ' sink.  It gets the highest priority (0).
  104. if Bindings.Count = 0 then
  105. GetNextPrio = 0
  106. else
  107. ' get the lowest existing priority value
  108. for each Binding in Bindings
  109. nPrioVal = Binding.SourceProperties.Item("Priority")
  110. if CInt(nPrioVal) > nLowestPrio then
  111. if err.number = 13 then
  112. err.clear
  113. else
  114. nLowestPrio = CInt(nPrioVal)
  115. end if
  116. end if
  117. next 
  118. ' assign priority values in increments of 10 so priorities
  119. ' can be shuffled later without the need to reorder all
  120. ' binding priorities.  Valid priority values are 0 - 32767
  121. if nLowestPrio + 10 > 32767 then
  122. GetNextPrio = -1
  123. else
  124. GetNextPrio = nLowestPrio + 10
  125. end if
  126. end if
  127. end function  
  128. '
  129. ' check for a previously registered sink with the passed in name
  130. '
  131. ' iInstance - the instance to work against
  132. ' szEvent - OnArrival
  133. ' szDisplayName - the display name of the event to check
  134. ' bCheckError - Any errors returned
  135. public sub CheckSink(iInstance, szEvent, szDisplayName, bCheckError)
  136. Dim SourceType
  137. Dim GUIDComCat
  138. Dim szSourceDisplayName
  139. Dim Source
  140. Dim Bindings
  141. Dim Binding
  142. bCheckError = FALSE
  143. select case LCase(szEvent)
  144. case "onarrival"
  145. GUIDComCat = GUIDComCatOnArrival
  146. case else
  147. WScript.echo "invalid event: " & szEvent
  148. exit sub
  149. end select
  150. ' find the source for this instance
  151. set SourceType = EventManager.SourceTypes(GUIDSourceType)
  152. szSourceDisplayName = szService & " " & iInstance
  153. for each Source in SourceType.Sources
  154. if Source.DisplayName = szSourceDisplayName then
  155. ' find the binding by display name.  to do this we enumerate
  156. ' all of the bindings and try to match on the display name
  157. set Bindings = Source.GetBindingManager.Bindings(GUIDComCat)
  158. for each Binding in Bindings
  159. if Binding.DisplayName = szDisplayName then
  160. ' we've found the binding, now log an error
  161. WScript.Echo "Binding with the name " & szDisplayName & " already exists"
  162. exit sub 
  163. end if
  164. next
  165. end if
  166. next
  167. bCheckError = TRUE
  168. end sub
  169. '
  170. ' unregister a previously registered sink
  171. '
  172. ' iInstance - the instance to work against
  173. ' szEvent - OnArrival
  174. ' szDisplayName - the display name of the event to remove
  175. '
  176. public sub UnregisterSink(iInstance, szEvent, szDisplayName)
  177. Dim SourceType
  178. Dim GUIDComCat
  179. Dim szSourceDisplayName
  180. Dim Source
  181. Dim Bindings
  182. Dim Binding
  183. select case LCase(szEvent)
  184. case "onarrival"
  185. GUIDComCat = GUIDComCatOnArrival
  186. case else
  187. WScript.echo "invalid event: " & szEvent
  188. exit sub
  189. end select
  190. ' find the source for this instance
  191. set SourceType = EventManager.SourceTypes(GUIDSourceType)
  192. szSourceDisplayName = szService & " " & iInstance
  193. for each Source in SourceType.Sources
  194. if Source.DisplayName = szSourceDisplayName then
  195. ' find the binding by display name.  to do this we enumerate
  196. ' all of the bindings and try to match on the display name
  197. set Bindings = Source.GetBindingManager.Bindings(GUIDComCat)
  198. for each Binding in Bindings
  199. if Binding.DisplayName = szDisplayName then
  200. ' we've found the binding, now remove it
  201. Bindings.Remove(Binding.ID)
  202. WScript.Echo "removed " & szDisplayName & " " & Binding.ID
  203. end if
  204. next
  205. end if
  206. next
  207. end sub
  208. '
  209. ' add or remove a property from the source or sink propertybag for an event
  210. '
  211. ' iInstance - the SMTP instance to edit
  212. ' szEvent - the event type (OnArrival)
  213. ' szDisplayName - the display name of the event
  214. ' szPropertyBag - the property bag to edit ("source" or "sink")
  215. ' szOperation - "add" or "remove"
  216. ' szPropertyName - the name to edit in the property bag
  217. ' szPropertyValue - the value to assign to the name (ignored for remove)
  218. '
  219. public sub EditProperty(iInstance, szEvent, szDisplayName, szPropertyBag, szOperation, szPropertyName, szPropertyValue)
  220. Dim SourceType
  221. Dim GUIDComCat
  222. Dim szSourceDisplayName
  223. Dim Source
  224. Dim Bindings
  225. Dim Binding
  226. Dim PropertyBag
  227. select case LCase(szEvent)
  228. case "onarrival"
  229. GUIDComCat = GUIDComCatOnArrival
  230. case else
  231. WScript.echo "invalid event: " & szEvent
  232. exit sub
  233. end select
  234. ' find the source for this instance
  235. set SourceType = EventManager.SourceTypes(GUIDSourceType)
  236. szSourceDisplayName = szService & " " & iInstance
  237. for each Source in SourceType.Sources
  238. if Source.DisplayName = szSourceDisplayName then
  239. set Bindings = Source.GetBindingManager.Bindings(GUIDComCat)
  240. ' find the binding by display name.  to do this we enumerate
  241. ' all of the bindings and try to match on the display name
  242. for each Binding in Bindings
  243. if Binding.DisplayName = szDisplayName then
  244. ' figure out which set of properties we want to modify
  245. ' based on the szPropertyBag parameter
  246. select case LCase(szPropertyBag)
  247. case "source"
  248. set PropertyBag = Binding.SourceProperties
  249. case "sink"
  250. set PropertyBag = Binding.SinkProperties
  251. case else
  252. WScript.echo "invalid propertybag: " & szPropertyBag
  253. exit sub
  254. end select
  255. ' figure out what operation we want to perform
  256. select case LCase(szOperation)
  257. case "remove"
  258. ' they want to remove szPropertyName from the
  259. ' property bag
  260. PropertyBag.Remove szPropertyName
  261. WScript.echo "removed property " & szPropertyName
  262. case "add"
  263. ' add szPropertyName to the property bag and 
  264. ' set its value to szValue.  if this value
  265. ' already exists then this will change  the value
  266. ' it to szValue.
  267. PropertyBag.Add szPropertyName, szPropertyValue
  268. WScript.echo "set property " & szPropertyName & " to " & szPropertyValue
  269. case else
  270. WScript.echo "invalid operation: " & szOperation
  271. exit sub
  272. end select
  273. ' save the binding
  274. Binding.Save
  275. end if
  276. next
  277. end if
  278. next
  279. end sub
  280. '
  281. ' this helper function takes an IEventSource object and a event category
  282. ' and dumps all of the bindings for this category under the source
  283. '
  284. ' Source - the IEventSource object to display the bindings for
  285. ' GUIDComCat - the event category to display the bindings for
  286. '
  287. public sub DisplaySinksHelper(Source, GUIDComCat)
  288. Dim Binding
  289. Dim propval
  290. ' walk each of the registered bindings for this component category
  291. for each Binding in Source.GetBindingManager.Bindings(GUIDComCat)
  292. ' display the binding properties
  293. WScript.echo "    Binding " & Binding.ID & " {"
  294. WScript.echo "      DisplayName = " & Binding.DisplayName
  295. WScript.echo "      SinkClass = " & Binding.SinkClass
  296. if Binding.Enabled = True then
  297. WScript.echo "      Status = Enabled"
  298. else
  299. WScript.echo "      Status = Disabled"
  300. end if
  301. ' walk each of the source properties and display them
  302. WScript.echo "      SourceProperties {"
  303. for each propval in Binding.SourceProperties
  304. WScript.echo "        " & propval & " = " & Binding.SourceProperties.Item(propval)
  305. next
  306. WScript.echo "      }"
  307. ' walk each of the sink properties and display them
  308. WScript.echo "      SinkProperties {"
  309. for each Propval in Binding.SinkProperties
  310. WScript.echo "        " & propval & " = " & Binding.SinkProperties.Item(Propval)
  311. next
  312. WScript.echo "      }"
  313. WScript.echo "    }"
  314. next
  315. end sub
  316. '
  317. ' dumps all of the information in the binding database related to SMTP
  318. '
  319. public sub DisplaySinks
  320. Dim SourceType
  321. Dim Source
  322. ' look for each of the sources registered for the SMTP source type
  323. set SourceType = EventManager.SourceTypes(GUIDSourceType)
  324. for each Source in SourceType.Sources
  325. ' display the source properties
  326. WScript.echo "Source " & Source.ID & " {"
  327. WScript.echo "  DisplayName = " & Source.DisplayName
  328. ' display all of the sinks registered for the OnArrival event
  329. WScript.echo "  OnArrival Sinks {"
  330. call DisplaySinksHelper(Source, GUIDComCatOnArrival)
  331. WScript.echo "  }"
  332. next
  333. end sub
  334. '
  335. ' enable/disable a registered sink
  336. '
  337. ' iInstance - the instance to work against
  338. ' szEvent - OnArrival
  339. ' szDisplayName - the display name for this new sink
  340. '
  341. public sub SetSinkEnabled(iInstance, szEvent, szDisplayName, szEnable)
  342. Dim SourceType
  343. Dim GUIDComCat
  344. Dim szSourceDisplayName
  345. Dim Source
  346. Dim Bindings
  347. Dim Binding
  348. select case LCase(szEvent)
  349. case "onarrival"
  350. GUIDComCat = GUIDComCatOnArrival
  351. case else
  352. WScript.echo "invalid event: " + szEvent
  353. exit sub
  354. end select
  355. ' find the source for this instance
  356. set SourceType = EventManager.SourceTypes(GUIDSourceType)
  357. szSourceDisplayName = szService + " " + iInstance
  358. for each Source in SourceType.Sources
  359. if Source.DisplayName = szSourceDisplayName then
  360. ' find the binding by display name.  to do this we enumerate
  361. ' all of the bindings and try to match on the display name
  362. set Bindings = Source.GetBindingManager.Bindings(GUIDComCat)
  363. for each Binding in Bindings
  364. if Binding.DisplayName = szDisplayName then
  365. ' we've found the binding, now enable/disable it
  366. ' we don't need "case else' because szEnable's value
  367. ' is set internally, not by users
  368. select case LCase(szEnable)
  369. case "true"
  370. Binding.Enabled = True
  371. Binding.Save
  372. WScript.Echo "enabled " + szDisplayName + " " + Binding.ID
  373. case "false"
  374. Binding.Enabled = False
  375. Binding.Save
  376. WScript.Echo "disabled " + szDisplayName + " " + Binding.ID
  377. end select
  378. end if
  379. next
  380. end if
  381. next
  382. end sub
  383. ' display usage information for this script
  384. '
  385. public sub DisplayUsage
  386. WScript.echo "usage: cscript smtpreg.vbs <command> <arguments>"
  387. WScript.echo "  commands:"
  388. WScript.echo "    /add <Instance> <Event> <DisplayName> <SinkClass> <Rule>"
  389. WScript.echo "    /remove <Instance> <Event> <DisplayName>"
  390. WScript.echo "    /setprop <Instance> <Event> <DisplayName> <PropertyBag> <PropertyName> "
  391. WScript.echo "             <PropertyValue>"
  392. WScript.echo "    /delprop <Instance> <Event> <DisplayName> <PropertyBag> <PropertyName>"
  393. WScript.echo "    /enable <Instance> <Event> <DisplayName>"
  394. WScript.echo "    /disable <Instance> <Event> <DisplayName>"
  395. WScript.echo "    /enum"
  396. WScript.echo "  arguments:"
  397. WScript.echo "    <Instance> is the SMTP instance to work against"
  398. WScript.echo "    <Event> can be OnArrival"
  399. WScript.echo "    <DisplayName> is the display name of the event to edit"
  400. WScript.echo "    <SinkClass> is the sink class for the event"
  401. WScript.echo "    <Rule> is the rule to use for the event"
  402. WScript.echo "    <PropertyBag> can be Source or Sink"
  403. WScript.echo "    <PropertyName> is the name of the property to edit"
  404. WScript.echo "    <PropertyValue> is the value to assign to the property"
  405. end sub
  406. Dim iInstance
  407. Dim szEvent
  408. Dim szDisplayName
  409. Dim szSinkClass
  410. Dim szRule
  411. Dim szPropertyBag
  412. Dim szPropertyName
  413. Dim szPropertyValue
  414. dim bCheck
  415. '
  416. ' this is the main body of our script.  it reads the command line parameters
  417. ' specified and then calls the appropriate function to perform the operation
  418. '
  419. if WScript.Arguments.Count = 0 then
  420. call DisplayUsage
  421. else 
  422. Select Case LCase(WScript.Arguments(0))
  423. Case "/add"
  424. if not WScript.Arguments.Count = 6 then
  425. call DisplayUsage
  426. else
  427. iInstance = WScript.Arguments(1)
  428. szEvent = WScript.Arguments(2)
  429. szDisplayName = WScript.Arguments(3)
  430. szSinkClass = WScript.Arguments(4)
  431. szRule = WScript.Arguments(5)
  432. call CheckSink(iInstance, szEvent, szDisplayName, bCheck)
  433. if bCheck = TRUE then
  434. call RegisterSink(iInstance, szEvent, szDisplayName, szSinkClass, szRule)
  435. End if
  436. end if
  437. Case "/remove"
  438. if not WScript.Arguments.Count = 4 then
  439. call DisplayUsage
  440. else
  441. iInstance = WScript.Arguments(1)
  442. szEvent = WScript.Arguments(2)
  443. szDisplayName = WScript.Arguments(3)
  444. call UnregisterSink(iInstance, szEvent, szDisplayName)
  445. end if
  446. Case "/setprop"
  447. if not WScript.Arguments.Count = 7 then
  448. call DisplayUsage
  449. else
  450. iInstance = WScript.Arguments(1)
  451. szEvent = WScript.Arguments(2)
  452. szDisplayName = WScript.Arguments(3)
  453. szPropertyBag = WScript.Arguments(4)
  454. szPropertyName = WScript.Arguments(5)
  455. szPropertyValue = WScript.Arguments(6)
  456. call EditProperty(iInstance, szEvent, szDisplayName, szPropertyBag, "add", szPropertyName, szPropertyValue)
  457. end if
  458. Case "/delprop"
  459. if not WScript.Arguments.Count = 6 then
  460. call DisplayUsage
  461. else
  462. iInstance = WScript.Arguments(1)
  463. szEvent = WScript.Arguments(2)
  464. szDisplayName = WScript.Arguments(3)
  465. szPropertyBag = WScript.Arguments(4)
  466. szPropertyName = WScript.Arguments(5)
  467. call EditProperty(iInstance, szEvent, szDisplayName, szPropertyBag, "remove", szPropertyName, "")
  468. end if
  469. Case "/enable"
  470. if not WScript.Arguments.Count = 4 then
  471. call DisplayUsage
  472. else
  473. iInstance = WScript.Arguments(1)
  474. szEvent = WScript.Arguments(2)
  475. szDisplayName = WScript.Arguments(3)
  476. call SetSinkEnabled(iInstance, szEvent, szDisplayName, "True")
  477. end if
  478. Case "/disable"
  479. if not WScript.Arguments.Count = 4 then
  480. call DisplayUsage
  481. else
  482. iInstance = WScript.Arguments(1)
  483. szEvent = WScript.Arguments(2)
  484. szDisplayName = WScript.Arguments(3)
  485. call SetSinkEnabled(iInstance, szEvent, szDisplayName, "False")
  486. end if
  487. Case "/enum"
  488. if not WScript.Arguments.Count = 1 then
  489. call DisplayUsage
  490. else
  491. call DisplaySinks
  492. end if
  493. Case Else
  494. call DisplayUsage
  495. End Select
  496. end if