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.
443 lines
10 KiB
443 lines
10 KiB
<?XML version="1.0" ?>
|
|
|
|
<package>
|
|
<job>
|
|
<resource id="computer">I32bt00X1</resource>
|
|
<resource id="domain">ntdev</resource>
|
|
<resource id="domainuser">winbld</resource>
|
|
<resource id="localgroup">Administrators</resource>
|
|
<resource id="Usage">
|
|
Name:
|
|
%SELF%
|
|
Adding the user account to the localgroup
|
|
Usage:
|
|
%SELF% -h -d -u:%USER% g:%GROUP%
|
|
Where
|
|
|
|
-h show this message
|
|
-d enable debugging
|
|
-u username. Default is "%DOMAINUSER%"
|
|
-g the name for the localgroup. Default: "%LOCALGROUP%"
|
|
|
|
</resource>
|
|
|
|
|
|
<script language="VBScript">
|
|
<![CDATA[
|
|
option explicit
|
|
|
|
|
|
Public Function reQuoteObjArgs(objArgs)
|
|
|
|
Dim sLabelVar, sFoundLabel, sArgsDictionary, sArg, oArgs, nArg
|
|
Dim poQuotedCheckRegEx, poStringCheckRegEx, psQuotedCheckPt
|
|
Dim sConcatArgs, aRepArgs, spBadQuotedPart, spGoodQuotedPart, apQuoted
|
|
|
|
|
|
sConcatArgs = join(objArgs, " ")
|
|
|
|
psQuotedCheckPt = "\'[^\']+\'"
|
|
|
|
Set poQuotedCheckRegEx = New RegExp
|
|
With poQuotedCheckRegEx
|
|
|
|
.Global = True
|
|
.IgnoreCase = True
|
|
.Pattern = psQuotedCheckPt
|
|
|
|
End with
|
|
|
|
Set poStringCheckRegEx = New RegExp
|
|
With poQuotedCheckRegEx
|
|
|
|
.Global = True
|
|
.IgnoreCase = True
|
|
.Pattern = psQuotedCheckPt
|
|
|
|
End with
|
|
|
|
If True = poQuotedCheckRegEx.Test(sConcatArgs) Then
|
|
|
|
Set apQuoted = poQuotedCheckRegEx.Execute(sConcatArgs)
|
|
For each spBadQuotedPart in apQuoted
|
|
spGoodQuotedPart = Replace(spBadQuotedPart," ", "0x20", 1, 1000)
|
|
spGoodQuotedPart = Mid(spGoodQuotedPart,2, Len(spGoodQuotedPart) -2 )
|
|
poStringCheckRegEx.Pattern = Replace(spBadQuotedPart, "\", "\\", 1 ,100)
|
|
sConcatArgs = poStringCheckRegEx.Replace(sConcatArgs, spGoodQuotedPart)
|
|
Next
|
|
|
|
|
|
|
|
aRepArgs = Split(sConcatArgs, " ")
|
|
|
|
oArgs = Array()
|
|
|
|
Redim oArgs (ubound(aRepArgs) + 1)
|
|
|
|
For nArg = 0 To ubound(aRepArgs)
|
|
|
|
oArgs(nArg) = Replace(aRepArgs(nArg), "0x20", " ", 1, 100)
|
|
|
|
Next
|
|
|
|
reQuoteObjArgs = oArgs
|
|
|
|
Else
|
|
|
|
reQuoteObjArgs = objArgs
|
|
|
|
End If
|
|
|
|
End Function
|
|
|
|
|
|
|
|
Public Sub GetParams(sFlags, sVarNames, objArgs)
|
|
|
|
Dim sLabelVar, sFoundLabel, sArgsDictionary
|
|
Dim poKnownSwitchRegEx, psMaskKnownSwitch, nArg, mma, nma, nextlen, objargsnamed
|
|
Dim aFlags, aVarNames ' Arrays to split the sFlags and sVarNames
|
|
|
|
Set poKnownSwitchRegEx = New RegExp
|
|
Set sArgsDictionary = CreateObject("Scripting.Dictionary")
|
|
|
|
psMaskKnownSwitch = "[-/]\w+:?\b"
|
|
poKnownSwitchRegEx.Global = True
|
|
poKnownSwitchRegEx.IgnoreCase = True
|
|
poKnownSwitchRegEx.Pattern = psMaskKnownSwitch
|
|
|
|
If 0 = ubound(objArgs) Then
|
|
|
|
Exit Sub
|
|
|
|
End If
|
|
|
|
For nArg = 0 to uBound(objArgs)
|
|
|
|
If True = poKnownSwitchRegEx.Test(objArgs(nArg)) Then
|
|
Set mmA = poKnownSwitchRegEx.Execute(objArgs(nArg))
|
|
If mma.Count <> 1 Then
|
|
WScript.echo "Bad RegExp Count"
|
|
Err.Raise (1937)
|
|
Else
|
|
For each nma in mma
|
|
NextLen = nma.FirstIndex + nma.Length
|
|
sFoundLabel = CStr(Mid(objArgs(nArg), _
|
|
2 + nma.FirstIndex, _
|
|
nma.Length - 1))
|
|
' This is not If Right(sFoundLabel,1) = ":" Then
|
|
' required sFoundLabel = Left(sFoundLabel, len(sFoundLabel) - 1 )
|
|
' End If
|
|
If NextLen <> len(objArgs(nArg)) Then
|
|
sLabelVar = CStr(Mid(objArgs(nArg),NextLen + 1 ))
|
|
Else
|
|
sLabelVar = True
|
|
End If
|
|
|
|
sArgsDictionary.add sFoundLabel, sLabelVar
|
|
|
|
Next
|
|
End If
|
|
End If
|
|
Next
|
|
|
|
|
|
aFlags = split(sFlags)
|
|
aVarNames = split(sVarNames)
|
|
If Ubound(aFlags) <> Ubound(aVarNames) Then
|
|
Exit Sub
|
|
End If
|
|
|
|
Dim tnCnt
|
|
For tnCnt = 0 to Ubound(aFlags)
|
|
|
|
If sArgsDictionary.Exists(aFlags(tnCnt)) Then
|
|
FeedVar sArgsDictionary(aFlags(tnCnt)), aVarNames(tnCnt)
|
|
End If
|
|
Next
|
|
|
|
|
|
Set sArgsDictionary = Nothing
|
|
Set poKnownSwitchRegEx = Nothing
|
|
End Sub
|
|
|
|
Private Sub FeedVar(sLabelVar, sLabel)
|
|
|
|
If VarType(sLabelVar) <> vbString Then
|
|
|
|
Execute(sLabel & "=" & sLabelVar)
|
|
|
|
Else
|
|
|
|
Execute(sLabel & "=" & """" & sLabelVar & """" )
|
|
|
|
End If
|
|
|
|
|
|
End Sub
|
|
|
|
]]>
|
|
</script>
|
|
|
|
<script language="VBScript">
|
|
<![CDATA[
|
|
|
|
Function ReadResource(sPresId)
|
|
|
|
On Error resume next
|
|
Dim WshShell
|
|
|
|
Set WshShell = CreateObject("WScript.Shell")
|
|
Dim sPRes, asRes, uRes, tsRes
|
|
|
|
sPREs = GetResource(sPresId)
|
|
|
|
If Err.number <> 0 Then
|
|
|
|
Wscript.echo err.number & " " & err.description
|
|
' The Error description are not informative when failed getresource
|
|
IF Err.number = 7 Then
|
|
Wscript.echo chr(9) & "Null resource: " & _
|
|
sPresId
|
|
End If
|
|
IF Err.number = 5 Then
|
|
Wscript.echo chr(9) & "Undefined resource: " & _
|
|
sPresId
|
|
End If
|
|
Wscript.quit
|
|
End If
|
|
|
|
asRes = Split(WshShell.ExpandEnvironmentStrings(sPRes), VBNEWLINE)
|
|
|
|
Set ures = CreateObject("Scripting.Dictionary")
|
|
|
|
For Each tsRes in asRes
|
|
|
|
If 0 <> Len(tsRes) Then
|
|
uRes(tsRes) = 1
|
|
End If
|
|
Next
|
|
|
|
Dim tResource
|
|
|
|
tResource = uRes.Keys
|
|
|
|
If uBound(tResource) = 0 Then
|
|
ReadResource = tResource(0)
|
|
Else
|
|
ReadResource = tResource
|
|
End If
|
|
|
|
Set WshShell = Nothing
|
|
Set uRes = Nothing
|
|
|
|
End Function
|
|
|
|
sub showUsage
|
|
|
|
Const VBEXPECTED = 5
|
|
on error resume next
|
|
Dim oGenRplaceVarNamXp
|
|
Dim oExRplaceVarNamXp
|
|
Dim aoRplaceMatches, oMatch, sMatch, sLabel, sResource
|
|
|
|
Set oGenRplaceVarNamXp = new RegExp
|
|
Set oExRplaceVarNamXp = new RegExp
|
|
|
|
With oGenRplaceVarNamXp
|
|
.Global = True
|
|
.IgnoreCase = True
|
|
.Pattern = "%\w+%"
|
|
End With
|
|
|
|
With oExRplaceVarNamXp
|
|
.Global = True
|
|
.IgnoreCase = True
|
|
.Pattern = "%\w+%"
|
|
End With
|
|
|
|
Dim sLine,asTest
|
|
|
|
asTest = ReadResource("Usage")
|
|
|
|
For Each sLine in asTest
|
|
|
|
Set aoRplaceMatches = oGenRplaceVarNamXp.Execute(sLine)
|
|
|
|
For Each oMatch in aoRplaceMatches
|
|
|
|
sMatch = oMatch.value
|
|
|
|
sMatch = UCase(Mid(sMatch, 2, Len(sMatch)-2))
|
|
|
|
sLabel = LCase(sMatch)
|
|
|
|
Err.clear
|
|
|
|
sResource = GetResource(sLabel)
|
|
|
|
If err = 0 Then
|
|
|
|
sMatch = sResource
|
|
|
|
ElseIf err = VBEXPECTED Then
|
|
|
|
sMatch = "<" & sMatch & ">"
|
|
|
|
Else
|
|
|
|
Raise Err
|
|
|
|
End If
|
|
|
|
oExRplaceVarNamXp.Pattern = oMatch.value
|
|
|
|
sLine = oExRplaceVarNamXp.Replace(sLine, sMatch)
|
|
|
|
Next
|
|
WScript.echo sLine
|
|
Next
|
|
|
|
WScript.Quit(0)
|
|
|
|
End sub
|
|
|
|
]]>
|
|
</script>
|
|
|
|
|
|
|
|
<script language="VBScript">
|
|
<![CDATA[
|
|
|
|
Dim Debug, Help, siLocalGroup, siDomainUser
|
|
Dim sLocalGroup, sDomainUser, sLocalComputer, oNetwork
|
|
Dim apCopyArgs, nRawArg
|
|
|
|
|
|
|
|
sDomainUser = CStr(GetResource("domainuser"))
|
|
sLocalGroup = CStr(GetResource("localgroup"))
|
|
sLocalComputer = CStr(GetResource("computer"))
|
|
sDomain = CStr(GetResource("domain"))
|
|
Set oNetwork = CreateObject("WScript.Network")
|
|
sLocalComputer = CStr(oNetwork.ComputerName)
|
|
|
|
apCopyArgs = Array()
|
|
|
|
Redim apCopyArgs (Wscript.arguments.Count)
|
|
|
|
For nRawArg = 0 to Wscript.arguments.Count - 1
|
|
|
|
apCopyArgs(nRawArg) = Wscript.arguments(nRawArg)
|
|
|
|
Next
|
|
|
|
apCopyArgs = reQuoteObjArgs(apCopyArgs)
|
|
|
|
|
|
Call GetParams("h d u: g:", _
|
|
"Help Debug siDomainUser siLocalGroup", _
|
|
apCopyArgs)
|
|
|
|
|
|
if Help <> "" Then
|
|
|
|
ShowUsage
|
|
|
|
End If
|
|
|
|
if siDomainUser <> "" Then
|
|
|
|
sDomainUser = siDomainUser
|
|
|
|
End If
|
|
|
|
if siLocalGroup <> "" Then
|
|
|
|
sLocalGroup = siLocalGroup
|
|
|
|
End If
|
|
|
|
Call AddUser(sLocalComputer, sDomain, sLocalGroup, sDomainUser)
|
|
|
|
WScript.quit(0)
|
|
|
|
private sub AddUser (sLocalComputer, sDomain, sLocalGroup, sDomainUser)
|
|
|
|
on error resume next
|
|
err.clear
|
|
|
|
set objGroup = GetObject("WinNT://" & sLocalComputer & "/" & sLocalGroup)
|
|
objGroup.Add "WinNT://" & sDomain & "/" & sDomainUser
|
|
|
|
if err.number <> 0 then
|
|
If True = Debug then
|
|
WScript.Echo "Unable to add " & _
|
|
sDomainUser & _
|
|
" to group " & _
|
|
sLocalGroup & _
|
|
VBNEWLINE & _
|
|
Err.number & _
|
|
VBNEWLINE & _
|
|
err.Description
|
|
End If
|
|
''
|
|
''
|
|
Const cMode ="WQL"
|
|
Const lsWMIMoniker = "winmgmts:{impersonationLevel=impersonate}"
|
|
|
|
sPGroupComponentTemplate = _
|
|
"Win32_Group.Domain=\""" & _
|
|
Ucase(sLocalComputer) & _
|
|
"\"",Name=\"""& _
|
|
sLocalGroup & _
|
|
"\"""
|
|
|
|
|
|
sPWMIQueryString="SELECT * FROM Win32_GroupUser " &_
|
|
"WHERE GroupComponent=""" & sPGroupComponentTemplate & """"
|
|
|
|
|
|
Set atPResWMIObjS = GetObject(lsWMIMoniker)._
|
|
ExecQuery(sPWMIQueryString, _
|
|
cMode)
|
|
|
|
sPPartComponentTemplate="Win32_UserAccount.Domain=\""" & _
|
|
UCase(sDomain) & _
|
|
"\"",Name=\""" & _
|
|
UCase(sDomainUser) & _
|
|
"\"""
|
|
For Each tPResWMIObjS In atPResWMIObjS
|
|
Set oPPartComponentRegEx = New RegExp
|
|
oPPartComponentRegEx.Global = True
|
|
oPPartComponentRegEx.IgnoreCase = True
|
|
oPPartComponentRegEx.Pattern = sPPartComponentTemplate
|
|
|
|
Set aDummy = oPPartComponentRegEx.Execute(tPResWMIObjS.PartComponent)
|
|
|
|
If aDummy.Count <> 0 Then
|
|
If Debug = True Then
|
|
|
|
WScript.echo """" & _
|
|
sPWMIQueryString & _
|
|
"""" & _
|
|
VBNEWLINE & _
|
|
tPResWMIObjS.PartComponent
|
|
|
|
End If
|
|
End If
|
|
Next
|
|
|
|
Else
|
|
If True = Debug Then
|
|
Wscript.Echo "Finished adding " & sDomainUser & " to group " & sLocalGroup
|
|
End If
|
|
end if
|
|
end sub
|
|
|
|
|
|
]]>
|
|
</script>
|
|
</job>
|
|
</package>
|