Hello,
Our script guy has come up with a certain performance improvement. However, keep in mind that often the time required for a script to run depends on your environment. In this particular case the performance of the script may depend on whether all of the computers that are polled are available. If some of the computers are unavailable (e.g. powered off), the script will still try to connect to them, and this involves the standard timeout required to identify that the computer is down.
Here's the updated version of the script. Instead of using the Invoke-Command cmdlet in a foreach loop, it passes an array of computers to the Invoke-Command cmdlet, and only connection to the computers is performed in the foreach loop.
Import-Module Adaxes
$credentialDirectoryPath = "C:\Credentials"
$targetUserName = "%username%"
# Get name of the user's domain
$domainName = $Context.GetObjectDomain("%distinguishedName%")
# Get credentials for the domain
if(!(Test-Path -Path $credentialDirectoryPath))
{
$Context.LogMessage("The credentials folder was not found. Make sure that $credentialDirectoryPath exists.", "Error")
return
}
$directory = Get-ChildItem -Path $credentialDirectoryPath -Filter $domainName
if(!$directory)
{
$Context.LogMessage("The credentials folder for domain $domainName was not found.", "Error")
return
}
# Read credentials for the domain from the file
$file = Get-ChildItem -Path $directory.FullName
if(!$file)
{
$Context.LogMessage("The credentials file for domain $domainName was not found.", "Error")
return
}
$userName = (Get-Content -Path $file.FullName)[0]
$passwordEncryptedString = (Get-Content -Path $file.FullName)[1]
$password = ConvertTo-SecureString -String $passwordEncryptedString
$credential = New-Object System.Management.Automation.PsCredential($userName,$password)
# Get all computers from the user's domain
$computers = Get-AdmComputer -Filter {(Enabled -eq $True) -and (operatingSystem -like "*Server*") -and (name -like "*MF*" -or name -like "*ctx*" -or name -like "*xap*" -or name -like "*TS*")} `
-AdaxesService localhost -Server $domainName
# Create a remote PowerShell session
$session = New-PSSession $file.Name -Authentication Negotiate -Credential $credential
$result = Invoke-Command -Session $session -ArgumentList $computers, $targetUserName -Scriptblock {
param($computers, $targetUserName)
Import-Module PSTerminalServices
$sessionsInfo = @()
foreach($computer in $computers)
{
try
{
$session = Get-TSSession -ComputerName $computer.DNSHostName -UserName $targetUserName
if($session)
{
$sessionsInfo += "User has a " + $session.State + " session on " + $computer.Name
}
}
catch
{
continue
}
}
return $sessionsInfo
}
Remove-PSSession $session
if($result -eq $NULL)
{
$Context.LogMessage("No session information for the user.", "Information") # TODO: modify me
return
}
foreach($sessionInfo in $result)
{
$Context.LogMessage($sessionInfo, "Information")
}