MarcosBarroso
asked on
Small program to get server OS name
I got this small C source code and compiled with GCC, in order to get server OS information, using data stored in ServerMessegeBlock (SMB) APIs.
When I call it with no parameters, the code correctily shows OS from current machine:
"GetOSName.exe ENTER"
But when a run the utility passing server name, no information is printed:
"GetOSName.exe \\MYSERVER ENTER"
So, what is wrong with this code ?
When I call it with no parameters, the code correctily shows OS from current machine:
"GetOSName.exe ENTER"
But when a run the utility passing server name, no information is printed:
"GetOSName.exe \\MYSERVER ENTER"
So, what is wrong with this code ?
#ifndef UNICODE
#define UNICODE
#endif
#pragma comment(lib, "netapi32.lib")
#include <stdio.h>
#include <windows.h>
#include <lm.h>
int main(int argc, wchar_t *argv[])
{
DWORD dwLevel = 101;
LPSERVER_INFO_101 pBuf = NULL;
NET_API_STATUS nStatus;
LPTSTR pszServerName = NULL;
if (argc > 2)
{
fwprintf(stderr, L"Usage: %s [\\\\ServerName]\n", argv[0]);
exit(1);
}
// The server is not the default local computer.
//
if (argc == 2)
pszServerName = (LPTSTR) argv[1];
//
// Call the NetServerGetInfo function, specifying level 101.
//
nStatus = NetServerGetInfo(pszServerName,
dwLevel,
(LPBYTE *)&pBuf);
//
// If the call succeeds,
//
if (nStatus == NERR_Success)
{
//
// Check for the type of server.
//
printf("sv101_type..........: %d\n", pBuf->sv101_type);
wprintf(L"sv101_name..........: %s\n", pBuf->sv101_name);
printf("sv101_platform_id...: %d\n", pBuf->sv101_platform_id);
printf("sv101_version_major.: %d\n", pBuf->sv101_version_major);
printf("sv101_version_minor.: %d\n", pBuf->sv101_version_minor);
wprintf(L"sv101_comment.......: %s\n", pBuf->sv101_comment);
if ((pBuf->sv101_type & SV_TYPE_DOMAIN_CTRL) ||
(pBuf->sv101_type & SV_TYPE_DOMAIN_BAKCTRL) ||
(pBuf->sv101_type & SV_TYPE_SERVER_NT))
printf("This is a server\n");
else
printf("This is a workstation\n");
}
//
// Otherwise, print the system error.
//
else
fprintf(stderr, "A system error has occurred: %d\n", nStatus);
//
// Free the allocated memory.
//
if (pBuf != NULL)
NetApiBufferFree(pBuf);
return 0;
}
ASKER
If I use
"GetOSName.exe \\MYSERVER ENTER" or
"GetOSName.exe MYSERVER ENTER"
Then i get value 53 returned to variable nStatus:
" A system error has occurred: 53"
Thanks
Marcos
"GetOSName.exe \\MYSERVER ENTER" or
"GetOSName.exe MYSERVER ENTER"
Then i get value 53 returned to variable nStatus:
" A system error has occurred: 53"
Thanks
Marcos
ASKER
I think my error is in line 26:
"pszServerName = (LPTSTR) argv[1];"
Maybe wrong cast or string /pointer type, because if I don't pass any parameter, information about current machine is showed ok.
Marcos
"pszServerName = (LPTSTR) argv[1];"
Maybe wrong cast or string /pointer type, because if I don't pass any parameter, information about current machine is showed ok.
Marcos
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
I'll go out on a limb and make a fool of myself, but doesn't function main have char *argv, not wchar_t:
int main(int argc, char *argv[])
a wizard generated win32 console project in Visual Studio has function
int _tmain(int argc, LPTSTR argv[]);
as main function where the LPTSTR either is char* or wchar_t*
Sara
int _tmain(int argc, LPTSTR argv[]);
as main function where the LPTSTR either is char* or wchar_t*
Sara
The WinAPI "NetServerGetInfo" uses LPWSTR servername as server name's input.
Therefore, you should use unicode.
As might be seen in MSDn code example (http://msdn.microsoft.com/en-us/library/aa370624%28v=vs.85%29.aspx), use "int wmain(int argc, wchar_t *argv[])".
BTW:Your code looks a lot like that code example. Might it be that you've omitted to copy the "int wmain..." line?
Could you change that and try again?
Thanks.
Therefore, you should use unicode.
As might be seen in MSDn code example (http://msdn.microsoft.com/en-us/library/aa370624%28v=vs.85%29.aspx), use "int wmain(int argc, wchar_t *argv[])".
BTW:Your code looks a lot like that code example. Might it be that you've omitted to copy the "int wmain..." line?
Could you change that and try again?
Thanks.
MarcosBarroso: Did you try my simple change on the "main" line just to see if it works?
sara: He's using "main", not "_tmain". I think it makes a difference. The raw "main" is the same in C and C++:
http://en.wikipedia.org/wiki/Main_function
sara: He's using "main", not "_tmain". I think it makes a difference. The raw "main" is the same in C and C++:
http://en.wikipedia.org/wiki/Main_function
I knew I'd be the fool in this discussion. Good going sarabande.
sjklein42, i like your humour :-)
you rightly stated that marcosborroso used wrong argument wchar_t* as type for second argument.
Sara
you rightly stated that marcosborroso used wrong argument wchar_t* as type for second argument.
Sara
Could you please add the output of your program when using the server name?
Do you get the ""A system error has occurred" message?
Thanks.