views:

1407

answers:

2

Under normal circumstances, a VB.NET application of mine can check the ClientName environmental variable to get the name of the workstation the user is connecting from.

So when WorkstationX RDPs into ServerA:

  • ComputerName=ServerA
  • ClientName=WorkstationX

That works fine.

If I right-click on the application and choose Run As Administrator, the ClientName variable is not set.

Does anyone know of a way of easily getting the workstation name of the client connected to the terminal server, even when the application is launched via "Run As Administrator"?

+2  A: 

The terminal services API might be your answer. I use it in a VB.NET app to log off user sessions on a given server, and to retrieve the names of the workstations connected to those sessions. The code I have has a lot of p-invoke stuff and is rather unwieldy, but I can post it if you want.

Chris Tybur
I assumed I would need to use WTSQuerySessionInformation to get to the value of WTSClientName, but haven't found any clean examples of doing so yet.
Kevin Fairchild
Clean as in working, or as in straightforward?
Chris Tybur
Clean as in working and minimal use of sketchy calls using ported VB6 code ;)
Kevin Fairchild
+2  A: 

If you don't want to deal with the P/Invoke business yourself, you can use Cassia, which wraps it for you:

New Cassia.TerminalServicesManager().CurrentSession.ClientName
Dan Ports