Detailed Published Application List for Citrix XenApp 5 and earlier farms

Hello Guys,

Here is the VB script I found immensely useful to extract the list of all the Citrix published applications in a XenApp 5.0 farm. This script will also work for all the Citrix farms below XenApp 6.0.

Copy the below script and save that as a VB script file and enjoy!

'Published Applications Report in Excel

strMbox = MsgBox("Do you want to include all the Applications Details?",3,"Include Details or just Basic?")

If strMbox = 6 Then

	appsList = "Details"

Elseif strMbox = 7 Then

	appsList = "Basic"

Else

	wscript.quit

End If

Set objExplorer = WScript.CreateObject("InternetExplorer.Application")
objExplorer.Navigate "about:blank"
objExplorer.Document.title = "Citrix Published Applications Report"
objExplorer.ToolBar = 0
objExplorer.StatusBar = 0
objExplorer.Width = 600
objExplorer.Height = 200 
objExplorer.Left = 0
objExplorer.Top = 0
objExplorer.Visible = 1  

Do While (objExplorer.Busy)
	Wscript.Sleep 200
Loop   

objExplorer.Document.Body.InnerHTML = "<b>Citrix Published Application Report is starting...</b><br>" 
wscript.sleep 1000

Set objExcel = CreateObject("Excel.Application")

Const xlSaveChanges = 1

objExcel.Visible = False

CurrentRow = 1 'the first row in excel is 1 (not 0)
Const xlAscending = 1
Const xlYes = 1 'will exclude the first active row from sorting

objExplorer.Document.Body.InnerHTML = "Retrieving the <b>Farm Name...</b> <br>"
wscript.sleep 1000

Set theFarm = CreateObject("MetaFrameCOM.MetaFrameFarm")

objExplorer.Document.Body.InnerHTML = "Gathering <b>" & theFarm.FarmName & "'s Apps...</b> <br>"
wscript.sleep 1000

'Formatting the current Date
strDate = pd(MONTH(date()),2) & "-" & _
	  pd(DAY(date()),2) & "-" & _ 
          YEAR(Date()) 

If appsList = "Details" then

	strVBSLog = theFarm.FarmName & " Published Applications Detailed Report " & strDate & ".xls"

Else

	strVBSLog = theFarm.FarmName & " Published Applications Basic Report " & strDate & ".xls"

End if

objExplorer.Document.Body.InnerHTML = "<b>Setting up Excel... </b> <br>"
wscript.sleep 1000

Set objWorkbook = objExcel.Workbooks.Add
Set objWorksheet = objWorkbook.Worksheets(1)

objExplorer.Document.Body.InnerHTML = "Adding <b>Header Row...</b>  <br>"
wscript.sleep 1000

If appsList = "Basic" then

	objExcel.Cells(CurrentRow, 1).Value = "Distinguished Name"
	objExcel.Cells(CurrentRow, 2).Value = "Application (Display) Name" 
	objExcel.Cells(CurrentRow, 3).Value = "Citrix Farm"

Else

	objExcel.Cells(CurrentRow, 1).Value = "Distinguished Name"
	objExcel.Cells(CurrentRow, 2).Value = "Application (Display) Name" 
	objExcel.Cells(CurrentRow, 3).Value = "Citrix Farm"
	objExcel.Cells(CurrentRow, 4).Value = "Command Line"
	objExcel.Cells(CurrentRow, 5).Value = "Working Directory"
	objExcel.Cells(CurrentRow, 6).Value = "Servers"
	objExcel.Cells(CurrentRow, 7).Value = "Users"
	objExcel.Cells(CurrentRow, 8).Value = "Groups"

End if

    Set mfFarm = CreateObject("MetaFrameCOM.MetaFrameFarm")
    mfFarm.Initialize 1

    objExplorer.Document.Body.InnerHTML = "Adding <b>Published Application Info...</b> <br>"
    wscript.sleep 1000

    For Each mfApp In mfFarm.Applications
        mfApp.LoadData 1

        objExplorer.Document.Body.InnerHTML = "Adding: <b>" & mfApp.AppName & " </b> <br>"

        CurrentRow = CurrentRow + 1

        If appsList = "Basic" then

		objExcel.Cells(CurrentRow, 1).Value = mfApp.DistinguishedName 
		objExcel.Cells(CurrentRow, 2).Value = mfApp.AppName
		objExcel.Cells(CurrentRow, 3).Value = mfApp.FarmName

	Else 
		appusers = ""
		appgroups = ""
		appservers= ""

		If mfApp.AppType = 17 Then 

			Set appContentObj=mfApp.ContentObject
			getusers()
			getgroups()		

			objExcel.Cells(CurrentRow, 1).Value = mfApp.DistinguishedName 
			objExcel.Cells(CurrentRow, 2).Value = mfApp.AppName
			objExcel.Cells(CurrentRow, 3).Value = mfApp.FarmName
			objExcel.Cells(CurrentRow, 4).Value = appContentObj.Contentaddress
			objExcel.Cells(CurrentRow, 5).Value = ""
			objExcel.Cells(CurrentRow, 6).Value = "This is Content, usually an internal shortcut, and just gets passed to the client. Does not run on a Citrix server"
			objExcel.Cells(CurrentRow, 7).Value = appusers
			objExcel.Cells(CurrentRow, 8).Value = appgroups

		Else

			Set aWinApp = mfApp.WinAppObject
			getservers()
			getusers()
			getgroups()

			objExcel.Cells(CurrentRow, 1).Value = mfApp.DistinguishedName 
			objExcel.Cells(CurrentRow, 2).Value = mfApp.AppName
			objExcel.Cells(CurrentRow, 3).Value = mfApp.FarmName

			If aWinApp.PNAttributes = 8 Then
							objExcel.Cells(CurrentRow, 4).Value = "Published Desktop"
							objExcel.Cells(CurrentRow, 5).Value = ""
						Else
							objExcel.Cells(CurrentRow, 4).Value = aWinApp.DefaultInitProg
							objExcel.Cells(CurrentRow, 5).Value = aWinApp.DefaultWorkDir
						End if
			objExcel.Cells(CurrentRow, 6).Value = appservers
			objExcel.Cells(CurrentRow, 7).Value = appusers
			objExcel.Cells(CurrentRow, 8).Value = appgroups

		End if	

	End if

    Next

objExplorer.Document.Body.InnerHTML = "<b>Sorting Aplhabetically...</b>  <br>"
wscript.sleep 200

Set objRange = objWorksheet.UsedRange
Set objRange2 = objExcel.Range("A1")
objRange.Sort objRange2, xlAscending, , , , , , xlYes

objExplorer.Document.Body.InnerHTML = "<b>Autofitting Columns...</b>  <br>"
wscript.sleep 200

objRange.EntireColumn.Autofit()

objExplorer.Document.Body.InnerHTML = "<b>Formatting Header Row...</b>  <br>"
wscript.sleep 200

If appsList = "Basic" then

	objExcel.Cells(1, 1).Font.Bold = TRUE
	objExcel.Cells(1, 1).Interior.ColorIndex = 30
	objExcel.Cells(1, 1).Font.ColorIndex = 2

	objExcel.Cells(1, 2).Font.Bold = TRUE
	objExcel.Cells(1, 2).Interior.ColorIndex = 30
	objExcel.Cells(1, 2).Font.ColorIndex = 2

	objExcel.Cells(1, 3).Font.Bold = TRUE
	objExcel.Cells(1, 3).Interior.ColorIndex = 30
	objExcel.Cells(1, 3).Font.ColorIndex = 2

Else

	objExcel.Cells(1, 1).Font.Bold = TRUE
	objExcel.Cells(1, 1).Interior.ColorIndex = 30
	objExcel.Cells(1, 1).Font.ColorIndex = 2

	objExcel.Cells(1, 2).Font.Bold = TRUE
	objExcel.Cells(1, 2).Interior.ColorIndex = 30
	objExcel.Cells(1, 2).Font.ColorIndex = 2

	objExcel.Cells(1, 3).Font.Bold = TRUE
	objExcel.Cells(1, 3).Interior.ColorIndex = 30
	objExcel.Cells(1, 3).Font.ColorIndex = 2

	objExcel.Cells(1, 4).Font.Bold = TRUE
	objExcel.Cells(1, 4).Interior.ColorIndex = 30
	objExcel.Cells(1, 4).Font.ColorIndex = 2

	objExcel.Cells(1, 5).Font.Bold = TRUE
	objExcel.Cells(1, 5).Interior.ColorIndex = 30
	objExcel.Cells(1, 5).Font.ColorIndex = 2

	objExcel.Cells(1, 6).Font.Bold = TRUE
	objExcel.Cells(1, 6).Interior.ColorIndex = 30
	objExcel.Cells(1, 6).Font.ColorIndex = 2

	objExcel.Cells(1, 7).Font.Bold = TRUE
	objExcel.Cells(1, 7).Interior.ColorIndex = 30
	objExcel.Cells(1, 7).Font.ColorIndex = 2

	objExcel.Cells(1, 8).Font.Bold = TRUE
	objExcel.Cells(1, 8).Interior.ColorIndex = 30
	objExcel.Cells(1, 8).Font.ColorIndex = 2

End if
objRange2.Range("A2").Select
objExcel.ActiveWindow.FreezePanes = "True"
objRange2.Range("A1").Select

objExplorer.Document.Body.InnerHTML = "Saving Spreadsheet as <b>" & strVBSLog & " </b> <br>"
wscript.sleep 1000
objExplorer.Quit

objExcel.ActiveWorkbook.SaveAs (strVBSLog)
objExcel.Quit

wscript.echo "File has been saved to My Documents as " & strVBSLog

objExcel.Application.Visible = True
Set objWorkbook = objExcel.Workbooks.Open(strVBSLog)

wscript.quit

Function pd(n, totalDigits) 
	If totalDigits > len(n) then 
		pd = String(totalDigits-len(n),"0") & n 
        else 
        	pd = n 
        End if 
End Function 

sub getusers()
For Each anUser In mfApp.Users

	appusers= appusers & " " & anUser.AAName & "\" & anUser.UserName

Next
End sub

sub getgroups()
For Each anGroup In mfApp.Groups

	appgroups= appgroups & " " & anGroup.AAName & "\" & anGroup.GroupName

Next 
End sub

sub getservers()
For Each anServer In mfApp.Servers

	appservers= appservers & " " & anServer.ServerName

Next 	
End sub

16 responses to “Detailed Published Application List for Citrix XenApp 5 and earlier farms”

  1. I also receive the error ” activex component can’t create object ‘metaframecom.metaframefarm’ ” running as a Domain Admin that is a member of the Citrix Admin group.

    Please advise. I appreciate your help.

    1. Is the domain admin account a Farm admin as well? that account should have full admin rights on the XenApp Farm.

      1. Yes. The domain admin account has Full Citrix Admin access. I wonder if the issue related to this farm being 6.0.

        1. I havent tried this yet on a farm that is above XenApp 5.0

        2. This is not going to work in farms from XA 6.0 and above as the SDK COM components doesn’t work on them. for the latest farms, PowerShell SDKs are the way to go.

  2. Is there a way to add a column that states whether the app is enabled or disabled?

  3. I tried running this script but end up with error ” activex component can’t create object ‘metaframecom.metaframefarm’ ” Im running this script with administrator account but it fails to create report. any help?

    1. ensure that the account is a Citrix administrator as well. the account would need to query the Citrix farm and populate the farm entities for you.

  4. I tried running this script but end up with error ” activex component can’t create object ‘metaframecom.metaframefarm’ ” Im running this script with administrator account but it fails to create report. any help?

  5. Good One ! Keep it up

  6. hello i am new to use all kind of scripts, on this parft of script I have to put my credentials or just need do copy paste and run it?
    sub getusers()
    For Each anUser In mfApp.Users

    appusers= appusers & ” ” & anUser.AAName & “\” & anUser.UserName

    Next
    End sub

    sub getgroups()
    For Each anGroup In mfApp.Groups

    appgroups= appgroups & ” ” & anGroup.AAName & “\” & anGroup.GroupName

    Next
    End sub

    sub getservers()
    For Each anServer In mfApp.Servers

    appservers= appservers & ” ” & anServer.ServerName

    Best regegards

    1. Nope, you just have to run the script with an account having admin rights…

      1. yes i was checking it but just work for XenApp 5.0 I need the application report for XenApp 6.5 do you have any suggest?

Leave a reply to Lal Mohan Cancel reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.