Monday, March 26, 2007

Group Membership Script

Reveals the members of a group.

Dim objArguments, strDomainGrp
Set objArguments = Wscript.Arguments
If WScript.Arguments.Count = 0 then Wscript.Quit
strDomainGrp=objArguments(0)
On Error Resume Next
Set objGroup = GetObject("LDAP://cn=" & strDomainGrp & ",ou=distribution lists,dc=company,dc=com")
objGroup.GetInfo
arrMemberOf = objGroup.GetEx("member")
For Each strMember in arrMemberOf
WScript.echo """" & strDomainGrp & """;""" & strMember & """"
Next

Clear Attribute Script

Clears an attribute (here targetAddress) from each account listed in input.txt.

Const ADS_PROPERTY_CLEAR = 1
Const ADS_NAME_INITTYPE_GC = 3
Const ADS_NAME_TYPE_NT4 = 3
Const ADS_NAME_TYPE_1779 = 1 'Distinguished Name
Set oRootDSE = GetObject("LDAP://RootDSE")
sDNSDomain = oRootDSE.Get("defaultNamingContext")
Set oTrans = CreateObject("NameTranslate")
oTrans.Init ADS_NAME_INITTYPE_GC, sDNSDomain
oTrans.Set ADS_NAME_TYPE_1779, sDNSDomain
sNetBIOSDomain = oTrans.Get(ADS_NAME_TYPE_NT4)
sNetBIOSDomain=Left(sNetBIOSDomain,Len(sNetBIOSDomain)-1)
sFile = "input.txt"
set oFSO = CreateObject("Scripting.FileSystemObject")
set oTextFile = oFSO.OpenTextFile (sFile)
Do
sUser = oTextFile.ReadLine
oTrans.Init ADS_NAME_TYPE_1779, sNetBIOSDomain
oTrans.Set ADS_NAME_TYPE_NT4, sNetBIOSDomain & "\" & sUser
sUserDN = oTrans.Get(ADS_NAME_TYPE_1779)
set oUser = GetObject ("LDAP://" & sUserDN)
oUser.PutEx ADS_PROPERTY_CLEAR, "targetAddress", 0
oUser.SetInfo
Loop Until oTextFile.AtEndOfLine = true
wscript.Echo "All Done"

Add Email Addresses Script

Adds an email address to accounts listed in input.txt

Const ADS_NAME_INITTYPE_GC = 3
Const ADS_NAME_TYPE_NT4 = 3
Const ADS_NAME_TYPE_1779 = 1 'Distinguished Name
Set oRootDSE = GetObject("LDAP://RootDSE")
sDNSDomain = oRootDSE.Get("defaultNamingContext")
Set oTrans = CreateObject("NameTranslate")
oTrans.Init ADS_NAME_INITTYPE_GC, sDNSDomain
oTrans.Set ADS_NAME_TYPE_1779, sDNSDomain
sNetBIOSDomain = oTrans.Get(ADS_NAME_TYPE_NT4)
sNetBIOSDomain=Left(sNetBIOSDomain,Len(sNetBIOSDomain)-1)
sFile = "input.txt"
set oFSO = CreateObject("Scripting.FileSystemObject")
set oTextFile = oFSO.OpenTextFile (sFile)
Do
sUser = oTextFile.ReadLine
oTrans.Init ADS_NAME_TYPE_1779, sNetBIOSDomain
oTrans.Set ADS_NAME_TYPE_NT4, sNetBIOSDomain & "\" & sUser
sUserDN = oTrans.Get(ADS_NAME_TYPE_1779)
set oUser = GetObject ("LDAP://" & sUserDN)
sAddress = "smtp:" & oUser.givenName & "." & oUser.SN & "@tgt1.company.com"
bIsFound = False
vProxyAddresses = oUser.ProxyAddresses
nProxyAddresses = UBound(vProxyAddresses)
i = 0
Do While i <= nProxyAddresses
If vProxyAddresses(i) = sAddress Then
bIsFound = True
'wscript.echo "address already exists for " & sUser
Exit Do
End If
i = i + 1
Loop
If Not bIsFound Then
wscript.echo "Adding " & sAddress
ReDim Preserve vProxyAddresses(nProxyAddresses + 1)
vProxyAddresses(nProxyAddresses + 1) = sAddress
oUser.ProxyAddresses = vProxyAddresses
oUser.SetInfo

End If
Loop Until oTextFile.AtEndOfLine = true
wscript.Echo "All Done"

Delete Mailboxes Script

Deletes the mailboxes associated with accounts in input.txt

Const ADS_NAME_INITTYPE_GC = 3
Const ADS_NAME_TYPE_NT4 = 3
Const ADS_NAME_TYPE_1779 = 1
Set oRootDSE = GetObject("LDAP://RootDSE")
sDNSDomain = oRootDSE.Get("defaultNamingContext")
Set oTrans = CreateObject("NameTranslate")
oTrans.Init ADS_NAME_INITTYPE_GC, sDNSDomain
oTrans.Set ADS_NAME_TYPE_1779, sDNSDomain
sNetBIOSDomain = oTrans.Get(ADS_NAME_TYPE_NT4)
sNetBIOSDomain=Left(sNetBIOSDomain,Len(sNetBIOSDomain)-1)
sFile = "input.txt"
set oFSO = CreateObject("Scripting.FileSystemObject")
set oInputFile = oFSO.OpenTextFile (sFile)
Do
sUser = oInputFile.ReadLine
oTrans.Init ADS_NAME_TYPE_1779, sNetBIOSDomain
oTrans.Set ADS_NAME_TYPE_NT4, sNetBIOSDomain & "\" & sUser
sUserDN = oTrans.Get(ADS_NAME_TYPE_1779)
set oUser = GetObject ("LDAP://" & sUserDN)
oUser.DeleteMailbox
oUser.SetInfo
Loop Until oInputFile.AtEndOfLine = true
wscript.Echo "All Done"

Move Mailboxes Script

Moves all the mailboxes listed in input.txt to a particular store.

Const ADS_NAME_INITTYPE_GC = 3
Const ADS_NAME_TYPE_NT4 = 3
Const ADS_NAME_TYPE_1779 = 1
sInFile = "input.txt"
Set oRootDSE = GetObject("LDAP://RootDSE")
sDNSDomain = oRootDSE.Get("defaultNamingContext")
Set oTrans = CreateObject("NameTranslate")
oTrans.Init ADS_NAME_INITTYPE_GC, sDNSDomain
oTrans.Set ADS_NAME_TYPE_1779, sDNSDomain
sNetBIOSDomain = oTrans.Get(ADS_NAME_TYPE_NT4)
sNetBIOSDomain=Left(sNetBIOSDomain,Len(sNetBIOSDomain)-1)
set oFSO = CreateObject("Scripting.FileSystemObject")
set oInputFile = oFSO.OpenTextFile (sInFile)
Do
sUser = oInputFile.ReadLine
oTrans.Init ADS_NAME_TYPE_1779, sNetBIOSDomain
oTrans.Set ADS_NAME_TYPE_NT4, sNetBIOSDomain & "\" & sUser
sUserDN = oTrans.Get(ADS_NAME_TYPE_1779)
set oUser = GetObject ("LDAP://" & sUserDN)
sExchangeServer = oUser.msExchHomeServerName
i = 1
Do
sRightPiece = Right(sExchangeServer, i)
If Left(sRightPiece, 1) = "=" Then
sExchangeServer = Right(sExchangeServer, i - 1)
Exit Do
End If
i = i + 1
Loop
sTargetMDB = "CN=Mailboxes,CN=Fourth Storage Group,CN=InformationStore,CN=" & sExchangeServer & ",CN=Servers,CN=First Administrative Group,CN=Administrative Groups,CN=RHD,CN=Microsoft Exchange,CN=Services,CN=Configuration,DC=company,DC=com"
oUser.MoveMailbox sTargetMDB
oUser.SetInfo
Loop Until oInputFile.AtEndOfLine = true
wscript.Echo "All Done"

Bulk Exmerge

Getting tired of writing scripts at one company, leaving, and having to reinvent the wheel, so I'll store some scripts here. Of course, next year we'll probably be on Exchange 2007 and all this work will be moot (see "Monad"), but just in case. And who knows, maybe somebody else will benefit from this someday, though these are well documented elsewhere (that's how I figured them out after all -- thanks google.)

This script takes an input.txt file full of samAccountNames and creates a Mailboxes.txt file ready for Exmerge to operate on in Bulk mode. Need to then call Exmerge /B /D. The exmerge.ini file needs to be setup with input servername, default destination folder, etc.

Exmerge needs the ExchangeLegacyDN in order to locate the mailbox. This code has good generic code that can be used to latch onto a user object. From there you can easily set any property on the account or extract info about the account.

Const ADS_NAME_INITTYPE_GC = 3
Const ADS_NAME_TYPE_NT4 = 3
Const ADS_NAME_TYPE_1779 = 1
sInFile = "input.txt"
sOutFile = "mailboxes.txt"
Set oRootDSE = GetObject("LDAP://RootDSE")
sDNSDomain = oRootDSE.Get("defaultNamingContext")
Set oTrans = CreateObject("NameTranslate")
oTrans.Init ADS_NAME_INITTYPE_GC, sDNSDomain
oTrans.Set ADS_NAME_TYPE_1779, sDNSDomain
sNetBIOSDomain = oTrans.Get(ADS_NAME_TYPE_NT4)
sNetBIOSDomain=Left(sNetBIOSDomain,Len(sNetBIOSDomain)-1)
set oFSO = CreateObject("Scripting.FileSystemObject")
set oInTextFile = oFSO.OpenTextFile (sInFile)
set oFSO = CreateObject("Scripting.FileSystemObject")
set oOutTextFile = oFSO.CreateTextFile (sOutFile)
Do
sUser = oInTextFile.ReadLine
oTrans.Init ADS_NAME_TYPE_1779, sNetBIOSDomain
oTrans.Set ADS_NAME_TYPE_NT4, sNetBIOSDomain & "\" & sUser
sUserDN = oTrans.Get(ADS_NAME_TYPE_1779)
set oUser = GetObject ("LDAP://" & sUserDN)
sLegacyExchangeDN = oUser.LegacyExchangeDN
oOutTextFile.Writeline sLegacyExchangeDN
Loop Until oInTextFile.AtEndOfLine = true
wscript.Echo "All Done"

Triple Play

Why have only two garden beds when I can have three! I now have 3 beds with 150 sq ft of gardening heaven. Still need to fill #3 with dirt.

Bed 1 has a wide block of carrots sprouting now. Garlic is tall & green & seems generally happy.

Bed 2 has 4 tomato plants (24" spacing? really?), then two rows of cucumbers, 3 half rows (block style) of peas, 3 half-rows of spinach, 3 half-rows of lettuce. Everything is well watered and fertilized. Plan to extend the half rows in a few weeks to extend the harvest.

Bed 3 has at least beets & squash planned for a bit later in spring. Do I want to tackle melons? hmmm.