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

模拟服务器

开发平台:

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