On Mon, Jul 6, 2015 at 1:44 PM, Ryan <[email protected]> wrote: > Couldn't you just do: > > $RA_User = $RunningApp.GetOwner().User > > instead of doing another query?
D'OH! Yes, I can. Dunno why I was blanking on the fact that all the returned objects from the first WMI call ... ALSO have the methods with them ... Now I feel stupid ... Yeah, the script execution time went from 5 min+ to like 15 seconds ... Thanks. Sorry for the waste of bandwidth ... > > On Mon, Jul 6, 2015 at 11:53 AM, Michael Leone <[email protected]> wrote: >> >> This is mostly for me to learn some PS techniques. What I am doing: >> >> I have a list of RemoteApps that is published on my RDS servers. From >> a workstation running Win2012 R2, I am trying to remotely query each >> of my 3 session hosts, and look at a list of users running each >> RemoteApp. (I get the list of RemoteApps like this: >> >> -------------- >> $OneSlash = "\" >> $TwoSlash = "\\" >> >> $PublishedRA = (Get-RDRemoteApp -ConnectionBroker $ConnectionBroker | >> Select -Property DisplayName,FilePath) | Sort -Property DisplayName >> >> ForEach ($RemoteApp in $PublishedRA) >> { >> $RA = New-Object PSObject >> $RA | Add-Member -MemberType NoteProperty -Name DisplayName -Value >> $RemoteApp.DisplayName >> $RA | Add-Member -MemberType NoteProperty -Name FilePath -Value >> $RemoteApp.FilePath.Replace($OneSlash, $TwoSlash) >> $RA | Add-Member -MemberType NoteProperty -Name TheExecutable -Value >> (Split-Path $RemoteApp.FilePath -Leaf) -Force >> $PublishedRemoteApps += $RA >> } >> >> >> That executes quickly enough. So I have a list of the RemoteApps and >> their executable path. Then I proceed to query the session hosts .I am >> doing a Get-WmiObject call, querying the processes on each session >> host for a process which has an executable that matches my RemoteApp. >> >> >> $RunningApps = Get-WmiObject -Class Win32_Process -ComputerName >> $SessionHost -Filter "ExecutablePath='$RA_FilePath'" >> >> This gives me all the processes on the remote server $SessionHost, >> that have an executable path the same as my published RemoteApp. (say >> there are 18 processes, meaning 18 users using this particular >> RemoteApp on this session host) >> >> (here comes the big part of my problem) >> Then, I am querying each of those returned objects for the owner's >> username, and constructing a list of those: >> >> ForEach ($RunningApp in $RunningApps) >> { >> $RA_User = "" >> $User_PID = $RunningApp.ProcessID >> $RA_User = (Get-WmiObject -Class Win32_Process -ComputerName >> $SessionHost -Filter "ProcessID='$User_PID'").GetOwner().User >> $RunningAppUser += $RA_User >> } >> >> Molasses in January would be faster than that, especially looping >> through 3 session hosts :-) But how else can I get the owner's >> username, of the process on the remote server? Usually, there are >> approx 60 users, spread across the 3 session hosts. >> >> Thanks for any pointers. I usually don't do WMI calls, so this is a >> way to learn ... >> >> >> ================================================ >> Did you know you can also post and find answers on PowerShell in the >> forums? >> http://www.myitforum.com/forums/default.asp?catApp=1 >> > > > ================================================ > Did you know you can also post and find answers on PowerShell in the forums? > http://www.myitforum.com/forums/default.asp?catApp=1 ================================================ Did you know you can also post and find answers on PowerShell in the forums? http://www.myitforum.com/forums/default.asp?catApp=1
