Here is some useful one-liners using dsquery to enumerate all the members of an AD security group and retrieve their e-mail addresses or retrieve an e-mail address from AD via a single user account. These come in handy when you need to create distribution lists for notifications or announcements. You can wrap these queries in batch scripts and pipe out to a file and import in to excel to cleanup.
dsquery
group -Name <AD Group Name> | dsget group -members | dsget user -email | findstr ".com" > output.txt
Also to retrieve e-mail addresses from single users use the following:
dsquery user -samid <username> | dsget user -email | findstr ".com" > output-user.txt
Here you will find different solutions, designs, and findings from different projects I've worked on.
Monday, June 25, 2012
Wednesday, June 13, 2012
VBScript to Enumerate Installed Applications and Versions
Here is a script I wrote to discover the installed application versions across a list of servers. I have it formatted so it will export a csv file with the information. Note: I also wrote some conditional statements to exclude some Windows update patches/hotfixes/security updates, etc.
To use: "cscript script.vbs" and will generate a results.csv file, also provide a ServerList.txt filled with the list of servers (by line) which you wish to scan the applications and their version numbers.
Here it is:
Dim args,computername, count
count = 0
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile1 = objFSO.OpenTextFile("ServerList.txt", ForReading)
Const ForReading = 1
'Read Compare To List
Dim ListToProcess()
i = 0
Do Until objFile1.AtEndOfStream
Redim Preserve ListToProcess(i)
ListToProcess(i) = objFile1.ReadLine
i = i + 1
Loop
objFile1.Close
For Each strLine in ListToProcess
if strLine <> "" then
computername = strLine
Call enumApps(strLine,1)
End if
Next
Function enumApps(computername,flag)
On Error Resume Next
Dim strComputer, strLine
strComputer = computername
Const HKLM = &H80000002
Const strKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
Wscript.echo "===============" & "Parsing " & computername & "==============="
Dim oReg, arrSubKeys, strProduct, strDisplayName, strVersion
Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
oReg.EnumKey HKLM, strKeyPath, arrSubKeys
For Each strProduct In arrSubKeys
oReg.GetStringValue HKLM, strKeyPath & "\" & strProduct, "DisplayName", strDisplayName
oReg.GetStringValue HKLM, strKeyPath & "\" & strProduct, "DisplayVersion", strVersion
Dim Filter
If InStr(1, strDisplayName, "", vbTextCompare) > 0 Then
If InStr(1, strDisplayName, "Security", vbTextCompare) = 0 Then
If InStr(1, strDisplayName, "Update", vbTextCompare) = 0 Then
If InStr(1, strDisplayName, "Hotfix", vbTextCompare) = 0 Then
strVersion = Replace(strVersion, ",", "")
strLine = strLine & strDisplayName & "," & strVersion & "," & strComputer & vbCrLf
'Wscript.echo strLine
End If
End If
End If
End If
Next
Dim ObjFso
Dim StrFileName
Dim ObjFile
StrFileName = "results.csv"
Set ObjFso = CreateObject("Scripting.FileSystemObject")
'Opening the file
Set ObjFile = ObjFso.OpenTextFile (StrFileName, 8, True)
If count = 0 then
objFile.WriteLine "Application Name, Version,Server"
count = 1
end if
objFile.WriteLine strLine
objFile.Close
End Function
To use: "cscript script.vbs" and will generate a results.csv file, also provide a ServerList.txt filled with the list of servers (by line) which you wish to scan the applications and their version numbers.
Here it is:
Dim args,computername, count
count = 0
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile1 = objFSO.OpenTextFile("ServerList.txt", ForReading)
Const ForReading = 1
'Read Compare To List
Dim ListToProcess()
i = 0
Do Until objFile1.AtEndOfStream
Redim Preserve ListToProcess(i)
ListToProcess(i) = objFile1.ReadLine
i = i + 1
Loop
objFile1.Close
For Each strLine in ListToProcess
if strLine <> "" then
computername = strLine
Call enumApps(strLine,1)
End if
Next
Function enumApps(computername,flag)
On Error Resume Next
Dim strComputer, strLine
strComputer = computername
Const HKLM = &H80000002
Const strKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
Wscript.echo "===============" & "Parsing " & computername & "==============="
Dim oReg, arrSubKeys, strProduct, strDisplayName, strVersion
Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
oReg.EnumKey HKLM, strKeyPath, arrSubKeys
For Each strProduct In arrSubKeys
oReg.GetStringValue HKLM, strKeyPath & "\" & strProduct, "DisplayName", strDisplayName
oReg.GetStringValue HKLM, strKeyPath & "\" & strProduct, "DisplayVersion", strVersion
Dim Filter
If InStr(1, strDisplayName, "", vbTextCompare) > 0 Then
If InStr(1, strDisplayName, "Security", vbTextCompare) = 0 Then
If InStr(1, strDisplayName, "Update", vbTextCompare) = 0 Then
If InStr(1, strDisplayName, "Hotfix", vbTextCompare) = 0 Then
strVersion = Replace(strVersion, ",", "")
strLine = strLine & strDisplayName & "," & strVersion & "," & strComputer & vbCrLf
'Wscript.echo strLine
End If
End If
End If
End If
Next
Dim ObjFso
Dim StrFileName
Dim ObjFile
StrFileName = "results.csv"
Set ObjFso = CreateObject("Scripting.FileSystemObject")
'Opening the file
Set ObjFile = ObjFso.OpenTextFile (StrFileName, 8, True)
If count = 0 then
objFile.WriteLine "Application Name, Version,Server"
count = 1
end if
objFile.WriteLine strLine
objFile.Close
End Function
Citrix Script to Enumerate Program Neighborhood Folders
Here's a MFCOM script I wrote up really quick that will output all the applications in a farm including their name, citrix management console path, and program neighborhood path. I wrote this because I was working on a customer site where the path between the PN and Citrix console differed causing big support headaches when users called in about apps not working and having trouble identifying which app they were talking about. We used this to discover what everything looked like and to design a new structure. This worked against a Citrix Presentation Server 4.5 Farm. Thanks to http://community.citrix.com/display/xa/Code+Share for providing me the base code to get this working.
Here it is, you can use it by doing cscript script.wsf > output.csv
<package>
<job id=" ListPNFolderPath">
<comment>
By Matt Shorrosh
</comment>
<runtime>
<description>
Enumerates the Application Name, CMC Path, PN Folder Path
</description>
</runtime>
<reference object="MetaFrameCOM.MetaFrameFarm"/>
<script language="VBScript">
Dim theFarm, aServer
'
' Create MetaFrameFarm object
'
Set theFarm = CreateObject("MetaFrameCOM.MetaFrameFarm")
if Err.Number <> 0 Then
WScript.Echo "Can't create MetaFrameFarm object"
WScript.Echo "(" & Err.Number & ") " & Err.Description
WScript.Echo ""
WScript.Quit Err.Number
End if
'
' Initialize the farm object.
'
theFarm.Initialize(MetaFrameWinFarmObject)
if Err.Number <> 0 Then
'WScript.Echo "Can't Initialize MetaFrameFarm object"
'WScript.Echo "(" & Err.Number & ") " & Err.Description
'WScript.Echo ""
'WScript.Quit Err.Number
End if
'
' Are you Citrix Administrator?
'
if theFarm.WinFarmObject.IsCitrixAdministrator = 0 then
'WScript.Echo "You must be a Citrix admin to run this script"
'WScript.Echo ""
'WScript.Quit 0
End If
'
For Each anApp In theFarm.Applications
anApp.loaddata(true)
if Err.Number <> 0 Then
WScript.Echo "Can't enumerate applications"
WScript.Echo "(" & Err.Number & ") " & Err.Description
WScript.Echo ""
WScript.Quit Err.Number
End if
Wscript.echo anApp.AppName & "," & anApp.DistinguishedName & "," & anApp.PNFolder
Next
</script>
</job>
</package>
Here it is, you can use it by doing cscript script.wsf > output.csv
<package>
<job id=" ListPNFolderPath">
<comment>
By Matt Shorrosh
</comment>
<runtime>
<description>
Enumerates the Application Name, CMC Path, PN Folder Path
</description>
</runtime>
<reference object="MetaFrameCOM.MetaFrameFarm"/>
<script language="VBScript">
Dim theFarm, aServer
'
' Create MetaFrameFarm object
'
Set theFarm = CreateObject("MetaFrameCOM.MetaFrameFarm")
if Err.Number <> 0 Then
WScript.Echo "Can't create MetaFrameFarm object"
WScript.Echo "(" & Err.Number & ") " & Err.Description
WScript.Echo ""
WScript.Quit Err.Number
End if
'
' Initialize the farm object.
'
theFarm.Initialize(MetaFrameWinFarmObject)
if Err.Number <> 0 Then
'WScript.Echo "Can't Initialize MetaFrameFarm object"
'WScript.Echo "(" & Err.Number & ") " & Err.Description
'WScript.Echo ""
'WScript.Quit Err.Number
End if
'
' Are you Citrix Administrator?
'
if theFarm.WinFarmObject.IsCitrixAdministrator = 0 then
'WScript.Echo "You must be a Citrix admin to run this script"
'WScript.Echo ""
'WScript.Quit 0
End If
'
For Each anApp In theFarm.Applications
anApp.loaddata(true)
if Err.Number <> 0 Then
WScript.Echo "Can't enumerate applications"
WScript.Echo "(" & Err.Number & ") " & Err.Description
WScript.Echo ""
WScript.Quit Err.Number
End if
Wscript.echo anApp.AppName & "," & anApp.DistinguishedName & "," & anApp.PNFolder
Next
</script>
</job>
</package>
Subscribe to:
Posts (Atom)