import-module activedirectory If ((Get-PSSnapin -Name "Citrix*" -ErrorAction SilentlyContinue | Measure-Object).count -eq 0) {Add-PSSnapin -Name "Citrix*"} Function IsMember ($ADObject, $GroupName) { # Function to check if $ADObject is a member of security group $GroupName. # Check if security group memberships for this principal have been determined. If ($GroupList.ContainsKey($ADObject.sAMAccountName.ToString() + "\") -eq $False) { # Memberships need to be determined for this principal. Add "pre-Windows 2000" # name to the hash table. $GroupList.Add($ADObject.sAMAccountName.ToString() + "\", $True) # Retrieve tokenGroups attribute of principal, which is operational. $ADObject.psbase.RefreshCache("tokenGroups") $SIDs = $ADObject.psbase.Properties.Item("tokenGroups") # Populate hash table with security group memberships. ForEach ($Value In $SIDs) { $SID = New-Object System.Security.Principal.SecurityIdentifier $Value, 0 # Translate into "pre-Windows 2000" name. $Group = $SID.Translate([System.Security.Principal.NTAccount]) If ($GroupList.ContainsKey($ADObject.sAMAccountName.ToString() + "\" + $Group.Value.Split("\")[1])) {write-host $Group -f yellow} else {$GroupList.Add($ADObject.sAMAccountName.ToString() + "\" + $Group.Value.Split("\")[1], $True)} } } # Check if $ADObject is a member of $GroupName. If ($GroupList.ContainsKey($ADObject.sAMAccountName.ToString() + "\" + $GroupName)) { Return $True } Else { Return $False } } clear $Farm = Get-Xafarm Write-host "Farm name : " $Farm -ForeGroundcolor "yellow" #List all app in farm $Apps = get-xaapplicationReport * $App_Count= (($Apps | measure-Object).count) # Hash table of security principals and their security group memberships. $GroupList = @{} #Var files $Path = Split-Path -Parent $MyInvocation.MyCommand.Path #Check directory script run $Path = $Path + "\" $Date = Get-Date -Format "yyyyMMddHHmm" $FileLog = ($Path + ("UserApp_" + $Farm + "_" + $Date + ".txt")) $CtxUser = Read-Host "Enter username" Add-Content $FileLog ("Farm name : " + $Farm ) Add-Content $FileLog ("Username : " + $CtxUser) Write-host "Published application(s) for :" $CtxUser -ForeGroundcolor "yellow" If (!(get-aduser -filter {SamAccountName -eq $CtxUser})) {write-host "User not found" -ForeGroundColor "red"} else { $UserDn = get-aduser $CtxUser $UserDn = $UserDn.DistinguishedName Write-host $UserDn -f yellow Add-Content $FileLog ($UserDn) # Bind to the user object in Active Directory. $User = [ADSI]("LDAP://"+$UserDn) $Count=0 #Check all Applications in farm Foreach ($App in $Apps) { $Accounts = $App.accounts $Count=$Count+1 Write-Progress -Activity "App in progress" -status " $Count app(s) checked on $App_Count" #Check all Account in current application Foreach ($Account in $Accounts) { If ($Account.AccountName -eq $CtxUser) { write-host $App "-" $Account.AccountName Add-Content $FileLog ($App.BrowserName + "-" + $Account.AccountName) } Else { #Search user in current group with IsMember Function If (IsMember $User ($Account.AccountName) -eq $True) { write-host $App "-" $Account Add-Content $FileLog ($App.BrowserName + "-" + $Account.AccountName) } } } } }