Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

442 lines
10 KiB

  1. <?XML version="1.0" ?>
  2. <package>
  3. <job>
  4. <resource id="computer">I32bt00X1</resource>
  5. <resource id="domain">ntdev</resource>
  6. <resource id="domainuser">winbld</resource>
  7. <resource id="localgroup">Administrators</resource>
  8. <resource id="Usage">
  9. Name:
  10. %SELF%
  11. Adding the user account to the localgroup
  12. Usage:
  13. %SELF% -h -d -u:%USER% g:%GROUP%
  14. Where
  15. -h show this message
  16. -d enable debugging
  17. -u username. Default is "%DOMAINUSER%"
  18. -g the name for the localgroup. Default: "%LOCALGROUP%"
  19. </resource>
  20. <script language="VBScript">
  21. <![CDATA[
  22. option explicit
  23. Public Function reQuoteObjArgs(objArgs)
  24. Dim sLabelVar, sFoundLabel, sArgsDictionary, sArg, oArgs, nArg
  25. Dim poQuotedCheckRegEx, poStringCheckRegEx, psQuotedCheckPt
  26. Dim sConcatArgs, aRepArgs, spBadQuotedPart, spGoodQuotedPart, apQuoted
  27. sConcatArgs = join(objArgs, " ")
  28. psQuotedCheckPt = "\'[^\']+\'"
  29. Set poQuotedCheckRegEx = New RegExp
  30. With poQuotedCheckRegEx
  31. .Global = True
  32. .IgnoreCase = True
  33. .Pattern = psQuotedCheckPt
  34. End with
  35. Set poStringCheckRegEx = New RegExp
  36. With poQuotedCheckRegEx
  37. .Global = True
  38. .IgnoreCase = True
  39. .Pattern = psQuotedCheckPt
  40. End with
  41. If True = poQuotedCheckRegEx.Test(sConcatArgs) Then
  42. Set apQuoted = poQuotedCheckRegEx.Execute(sConcatArgs)
  43. For each spBadQuotedPart in apQuoted
  44. spGoodQuotedPart = Replace(spBadQuotedPart," ", "0x20", 1, 1000)
  45. spGoodQuotedPart = Mid(spGoodQuotedPart,2, Len(spGoodQuotedPart) -2 )
  46. poStringCheckRegEx.Pattern = Replace(spBadQuotedPart, "\", "\\", 1 ,100)
  47. sConcatArgs = poStringCheckRegEx.Replace(sConcatArgs, spGoodQuotedPart)
  48. Next
  49. aRepArgs = Split(sConcatArgs, " ")
  50. oArgs = Array()
  51. Redim oArgs (ubound(aRepArgs) + 1)
  52. For nArg = 0 To ubound(aRepArgs)
  53. oArgs(nArg) = Replace(aRepArgs(nArg), "0x20", " ", 1, 100)
  54. Next
  55. reQuoteObjArgs = oArgs
  56. Else
  57. reQuoteObjArgs = objArgs
  58. End If
  59. End Function
  60. Public Sub GetParams(sFlags, sVarNames, objArgs)
  61. Dim sLabelVar, sFoundLabel, sArgsDictionary
  62. Dim poKnownSwitchRegEx, psMaskKnownSwitch, nArg, mma, nma, nextlen, objargsnamed
  63. Dim aFlags, aVarNames ' Arrays to split the sFlags and sVarNames
  64. Set poKnownSwitchRegEx = New RegExp
  65. Set sArgsDictionary = CreateObject("Scripting.Dictionary")
  66. psMaskKnownSwitch = "[-/]\w+:?\b"
  67. poKnownSwitchRegEx.Global = True
  68. poKnownSwitchRegEx.IgnoreCase = True
  69. poKnownSwitchRegEx.Pattern = psMaskKnownSwitch
  70. If 0 = ubound(objArgs) Then
  71. Exit Sub
  72. End If
  73. For nArg = 0 to uBound(objArgs)
  74. If True = poKnownSwitchRegEx.Test(objArgs(nArg)) Then
  75. Set mmA = poKnownSwitchRegEx.Execute(objArgs(nArg))
  76. If mma.Count <> 1 Then
  77. WScript.echo "Bad RegExp Count"
  78. Err.Raise (1937)
  79. Else
  80. For each nma in mma
  81. NextLen = nma.FirstIndex + nma.Length
  82. sFoundLabel = CStr(Mid(objArgs(nArg), _
  83. 2 + nma.FirstIndex, _
  84. nma.Length - 1))
  85. ' This is not If Right(sFoundLabel,1) = ":" Then
  86. ' required sFoundLabel = Left(sFoundLabel, len(sFoundLabel) - 1 )
  87. ' End If
  88. If NextLen <> len(objArgs(nArg)) Then
  89. sLabelVar = CStr(Mid(objArgs(nArg),NextLen + 1 ))
  90. Else
  91. sLabelVar = True
  92. End If
  93. sArgsDictionary.add sFoundLabel, sLabelVar
  94. Next
  95. End If
  96. End If
  97. Next
  98. aFlags = split(sFlags)
  99. aVarNames = split(sVarNames)
  100. If Ubound(aFlags) <> Ubound(aVarNames) Then
  101. Exit Sub
  102. End If
  103. Dim tnCnt
  104. For tnCnt = 0 to Ubound(aFlags)
  105. If sArgsDictionary.Exists(aFlags(tnCnt)) Then
  106. FeedVar sArgsDictionary(aFlags(tnCnt)), aVarNames(tnCnt)
  107. End If
  108. Next
  109. Set sArgsDictionary = Nothing
  110. Set poKnownSwitchRegEx = Nothing
  111. End Sub
  112. Private Sub FeedVar(sLabelVar, sLabel)
  113. If VarType(sLabelVar) <> vbString Then
  114. Execute(sLabel & "=" & sLabelVar)
  115. Else
  116. Execute(sLabel & "=" & """" & sLabelVar & """" )
  117. End If
  118. End Sub
  119. ]]>
  120. </script>
  121. <script language="VBScript">
  122. <![CDATA[
  123. Function ReadResource(sPresId)
  124. On Error resume next
  125. Dim WshShell
  126. Set WshShell = CreateObject("WScript.Shell")
  127. Dim sPRes, asRes, uRes, tsRes
  128. sPREs = GetResource(sPresId)
  129. If Err.number <> 0 Then
  130. Wscript.echo err.number & " " & err.description
  131. ' The Error description are not informative when failed getresource
  132. IF Err.number = 7 Then
  133. Wscript.echo chr(9) & "Null resource: " & _
  134. sPresId
  135. End If
  136. IF Err.number = 5 Then
  137. Wscript.echo chr(9) & "Undefined resource: " & _
  138. sPresId
  139. End If
  140. Wscript.quit
  141. End If
  142. asRes = Split(WshShell.ExpandEnvironmentStrings(sPRes), VBNEWLINE)
  143. Set ures = CreateObject("Scripting.Dictionary")
  144. For Each tsRes in asRes
  145. If 0 <> Len(tsRes) Then
  146. uRes(tsRes) = 1
  147. End If
  148. Next
  149. Dim tResource
  150. tResource = uRes.Keys
  151. If uBound(tResource) = 0 Then
  152. ReadResource = tResource(0)
  153. Else
  154. ReadResource = tResource
  155. End If
  156. Set WshShell = Nothing
  157. Set uRes = Nothing
  158. End Function
  159. sub showUsage
  160. Const VBEXPECTED = 5
  161. on error resume next
  162. Dim oGenRplaceVarNamXp
  163. Dim oExRplaceVarNamXp
  164. Dim aoRplaceMatches, oMatch, sMatch, sLabel, sResource
  165. Set oGenRplaceVarNamXp = new RegExp
  166. Set oExRplaceVarNamXp = new RegExp
  167. With oGenRplaceVarNamXp
  168. .Global = True
  169. .IgnoreCase = True
  170. .Pattern = "%\w+%"
  171. End With
  172. With oExRplaceVarNamXp
  173. .Global = True
  174. .IgnoreCase = True
  175. .Pattern = "%\w+%"
  176. End With
  177. Dim sLine,asTest
  178. asTest = ReadResource("Usage")
  179. For Each sLine in asTest
  180. Set aoRplaceMatches = oGenRplaceVarNamXp.Execute(sLine)
  181. For Each oMatch in aoRplaceMatches
  182. sMatch = oMatch.value
  183. sMatch = UCase(Mid(sMatch, 2, Len(sMatch)-2))
  184. sLabel = LCase(sMatch)
  185. Err.clear
  186. sResource = GetResource(sLabel)
  187. If err = 0 Then
  188. sMatch = sResource
  189. ElseIf err = VBEXPECTED Then
  190. sMatch = "<" & sMatch & ">"
  191. Else
  192. Raise Err
  193. End If
  194. oExRplaceVarNamXp.Pattern = oMatch.value
  195. sLine = oExRplaceVarNamXp.Replace(sLine, sMatch)
  196. Next
  197. WScript.echo sLine
  198. Next
  199. WScript.Quit(0)
  200. End sub
  201. ]]>
  202. </script>
  203. <script language="VBScript">
  204. <![CDATA[
  205. Dim Debug, Help, siLocalGroup, siDomainUser
  206. Dim sLocalGroup, sDomainUser, sLocalComputer, oNetwork
  207. Dim apCopyArgs, nRawArg
  208. sDomainUser = CStr(GetResource("domainuser"))
  209. sLocalGroup = CStr(GetResource("localgroup"))
  210. sLocalComputer = CStr(GetResource("computer"))
  211. sDomain = CStr(GetResource("domain"))
  212. Set oNetwork = CreateObject("WScript.Network")
  213. sLocalComputer = CStr(oNetwork.ComputerName)
  214. apCopyArgs = Array()
  215. Redim apCopyArgs (Wscript.arguments.Count)
  216. For nRawArg = 0 to Wscript.arguments.Count - 1
  217. apCopyArgs(nRawArg) = Wscript.arguments(nRawArg)
  218. Next
  219. apCopyArgs = reQuoteObjArgs(apCopyArgs)
  220. Call GetParams("h d u: g:", _
  221. "Help Debug siDomainUser siLocalGroup", _
  222. apCopyArgs)
  223. if Help <> "" Then
  224. ShowUsage
  225. End If
  226. if siDomainUser <> "" Then
  227. sDomainUser = siDomainUser
  228. End If
  229. if siLocalGroup <> "" Then
  230. sLocalGroup = siLocalGroup
  231. End If
  232. Call AddUser(sLocalComputer, sDomain, sLocalGroup, sDomainUser)
  233. WScript.quit(0)
  234. private sub AddUser (sLocalComputer, sDomain, sLocalGroup, sDomainUser)
  235. on error resume next
  236. err.clear
  237. set objGroup = GetObject("WinNT://" & sLocalComputer & "/" & sLocalGroup)
  238. objGroup.Add "WinNT://" & sDomain & "/" & sDomainUser
  239. if err.number <> 0 then
  240. If True = Debug then
  241. WScript.Echo "Unable to add " & _
  242. sDomainUser & _
  243. " to group " & _
  244. sLocalGroup & _
  245. VBNEWLINE & _
  246. Err.number & _
  247. VBNEWLINE & _
  248. err.Description
  249. End If
  250. ''
  251. ''
  252. Const cMode ="WQL"
  253. Const lsWMIMoniker = "winmgmts:{impersonationLevel=impersonate}"
  254. sPGroupComponentTemplate = _
  255. "Win32_Group.Domain=\""" & _
  256. Ucase(sLocalComputer) & _
  257. "\"",Name=\"""& _
  258. sLocalGroup & _
  259. "\"""
  260. sPWMIQueryString="SELECT * FROM Win32_GroupUser " &_
  261. "WHERE GroupComponent=""" & sPGroupComponentTemplate & """"
  262. Set atPResWMIObjS = GetObject(lsWMIMoniker)._
  263. ExecQuery(sPWMIQueryString, _
  264. cMode)
  265. sPPartComponentTemplate="Win32_UserAccount.Domain=\""" & _
  266. UCase(sDomain) & _
  267. "\"",Name=\""" & _
  268. UCase(sDomainUser) & _
  269. "\"""
  270. For Each tPResWMIObjS In atPResWMIObjS
  271. Set oPPartComponentRegEx = New RegExp
  272. oPPartComponentRegEx.Global = True
  273. oPPartComponentRegEx.IgnoreCase = True
  274. oPPartComponentRegEx.Pattern = sPPartComponentTemplate
  275. Set aDummy = oPPartComponentRegEx.Execute(tPResWMIObjS.PartComponent)
  276. If aDummy.Count <> 0 Then
  277. If Debug = True Then
  278. WScript.echo """" & _
  279. sPWMIQueryString & _
  280. """" & _
  281. VBNEWLINE & _
  282. tPResWMIObjS.PartComponent
  283. End If
  284. End If
  285. Next
  286. Else
  287. If True = Debug Then
  288. Wscript.Echo "Finished adding " & sDomainUser & " to group " & sLocalGroup
  289. End If
  290. end if
  291. end sub
  292. ]]>
  293. </script>
  294. </job>
  295. </package>