Want to win a PS4? Go Premium and enter to win our High-Tech Treats giveaway. Enter to Win

x
?
Solved

Accessing WTSQueryUserConfig in the wtsapi32.dll library

Posted on 2002-06-26
11
Medium Priority
?
946 Views
Last Modified: 2007-11-27
I'm currently trying to access the WTSQueryUserConfig function in wtsapi32.dll using the following code (see below)

The function TSEQueryConfig seems to work as I get a True value for 'Rtn' and 'Data' returns the correct length of the buffer, however nothing is returned in the buffer.

This is VERY urgent, hence the 500 points. It doesn't matter if it's a stupid mistake, you still get all the points.

Cheers.
Greg.

----------------------------------------------------
Public Declare Function TSEQueryConfig Lib "wtsapi32" Alias _
    "WTSQueryUserConfigA" (ByVal pServername As String, _
    ByVal pUserName As String, ByVal WTSConfigClass As WTS_CONFIG_CLASS, _
   ByVal pBuffer As String, ByRef DataLength As Long) As Boolean
   
Enum WTS_CONFIG_CLASS
   WTSUserConfigInitialProgram
   WTSUserConfigWorkingDirectory
   WTSUserConfigfInheritInitialProgram
   WTSUserConfigfAllowLogonTerminalServer
   WTSUserConfigTimeoutSettingsConnections
   WTSUserConfigTimeoutSettingsDisconnections
   WTSUserConfigTimeoutSettingsIdle
   WTSUserConfigfDeviceClientDrives
   WTSUserConfigfDeviceClientPrinters
   WTSUserConfigfDeviceClientDefaultPrinter
   WTSUserConfigBrokenTimeoutSettings
   WTSUserConfigReconnectSettings
   WTSUserConfigModemCallbackSettings
   WTSUserConfigModemCallbackPhoneNumber
   WTSUserConfigShadowingSettings
   WTSUserConfigTerminalServerProfilePath
   WTSUserConfigTerminalServerHomeDir
   WTSUserConfigTerminalServerHomeDirDrive
   WTSUserConfigfTerminalServerRemoteHomeDir
End Enum

Private Sub Command1_Click()
Dim buffptr As Long

svr = "SERVER" & vbNullChar
usr = "TESTUSER" & vbNullChar

Rtn = TSEQueryConfig(svr, usr, WTSUserConfigTerminalServerProfilePath, buffptr, Data)
End Sub
------------------------------------------------------
0
Comment
Question by:GregD
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
11 Comments
 
LVL 43

Expert Comment

by:TimCottee
ID: 7111072
You have declared the function to use pBuffer as a string but are using a long in buffptr to retrieve the result. I would imagine that if it is really a string that is returned then it should be passed as a string, if not then you would need to use CopyMemory api function to convert the returned pointer to a string.
0
 
LVL 5

Expert Comment

by:rpai
ID: 7111084
Did you try changing the WTSConfigClass parameter to check if that works?
WTSUserConfigTerminalServerProfilePath :-
The directory the path identifies must be created manually, and must exist prior to the logon. WTSSetUserConfig will not create the directory if it does not already exist.
0
 
LVL 1

Author Comment

by:GregD
ID: 7111169
TimCottee

I've tried almost all combinations for pbuffer & buffer, this one is the only one to return a True value for Rtn.
Buffer actually returns 0, not even a pointer, which is strange because the Data variable returns the correct length for the data that should be in the buffer.

rpai

Yup, tried most of the paramaters available, the one's that have data in them return the correct length in the data var, but nothing in the buffer. i.e. WTSUserConfigTerminalServerProfilePath returns 46 in the data var, which is the correct profile path & a nullchar.

WTSUserConfigTerminalServerHomeDirDrive returns 3 in the data var, which is the correct drive (H:) and a null char.

Any more ideas Guys???
0
Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

 
LVL 1

Author Comment

by:GregD
ID: 7111177
TimCottee

I've tried almost all combinations for pbuffer & buffer, this one is the only one to return a True value for Rtn.
Buffer actually returns 0, not even a pointer, which is strange because the Data variable returns the correct length for the data that should be in the buffer.

rpai

Yup, tried most of the paramaters available, the one's that have data in them return the correct length in the data var, but nothing in the buffer. i.e. WTSUserConfigTerminalServerProfilePath returns 46 in the data var, which is the correct profile path & a nullchar.

WTSUserConfigTerminalServerHomeDirDrive returns 3 in the data var, which is the correct drive (H:) and a null char.

Any more ideas Guys???
0
 
LVL 3

Expert Comment

by:PNJ
ID: 7111273
Ah. Do you need AddressOF Buffptr where BuffPtr is Dim'ed as a String (not Long)?

Long shot and a guess really.
0
 
LVL 3

Expert Comment

by:PNJ
ID: 7111275
As in:

Dim BuffPtr as String

Rtn = TSEQueryConfig(svr, usr, WTSUserConfigTerminalServerProfilePath, AddressOf buffptr, Data)
0
 
LVL 1

Author Comment

by:GregD
ID: 7115919
Thanks for the tip PNJ , but I keep getting compile errors when I try that.

However if I fill the buffer first I do get some output, but it's rubbish i.e.

Dim ppBuffer As String
svr = "SERVER" & vbNullChar
usr = "TESTUSER" & vbNullChar

ppBuffer = Space$(80)
tmp = TSEQueryConfig(svr, usr, WTSUserConfigTerminalServerProfilePath, ppBuffer, Data)

I have the feeling I'm nearly there, but i'm just missing the finale piece of the puzzle. This is getting really urgent now, so I'm upping the points.

Hope someone can shed some light on this

Thanks guys
Greg.
0
 
LVL 1

Author Comment

by:GregD
ID: 7115921
Unfortunatly I can't add more than 500 points for a single question, so I will post up another 500 points (1000 points in total) to anyone who solves my little problem.

Greg.
0
 
LVL 3

Expert Comment

by:PNJ
ID: 7121370
Thinking about the last two parameters and the way other API calls seem to work, I wonder if you need to set "Data" to (eg) 80 and "ppBuffer"  to 80 spaces (as you have). I'm just wondering that not setting "Data" to anything means it gets set left at 0 and the API call is saying, "fair enough, your buffer is zero long, so you won't get anything back".

I cant' find out anything about TSEQueryConfig so I couldn't try this. (sorry about AddressOf - it needs a Function to point to)
0
 
LVL 3

Accepted Solution

by:
PNJ earned 2000 total points
ID: 7121415
GregD, you've probably seen this, but in case you haven't:
http://support.microsoft.com/directory/article.asp?ID=KB;EN-US;Q292631&

The code example given supports TimCottee's initial thoughts about using CopyMemory API.
0
 
LVL 1

Author Comment

by:GregD
ID: 7121616
I had searched & searched msdn & technet but couldn't find anything like this,

In the end it was something stupid I'd forgotton to include the '\\' before the server name :))

Thanks for all the tips guys, but after testing the msdn code provided by PNJ my mistake became obvious.

I'll post you another 500 points as promised PNJ.

Thanks
Greg.
0

Featured Post

Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction In a recent article (http://www.experts-exchange.com/A_7811-A-Better-Concatenate-Function.html) for the Excel community, I showed an improved version of the Excel Concatenate() function.  While writing that article I realized that no o…
If you need to start windows update installation remotely or as a scheduled task you will find this very helpful.
Get people started with the process of using Access VBA to control Outlook using automation, Microsoft Access can control other applications. An example is the ability to programmatically talk to Microsoft Outlook. Using automation, an Access applic…
Get people started with the utilization of class modules. Class modules can be a powerful tool in Microsoft Access. They allow you to create self-contained objects that encapsulate functionality. They can easily hide the complexity of a process from…
Suggested Courses

604 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question