Expiring Today—Celebrate National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
?
Solved

Small program to get server OS name

Posted on 2011-03-01
10
Medium Priority
?
1,152 Views
Last Modified: 2012-05-11
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 ?
#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;
}

Open in new window

0
Comment
Question by:MarcosBarroso
[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
  • 3
  • 3
  • 2
  • +1
10 Comments
 
LVL 4

Expert Comment

by:denissie
ID: 35012397
Hi MacrosBarroso,

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.
0
 

Author Comment

by:MarcosBarroso
ID: 35016260
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

0
 

Author Comment

by:MarcosBarroso
ID: 35016433
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


0
Is Your AD Toolbox Looking More Like a Toybox?

Managing Active Directory can get complicated.  Often, the native tools for managing AD are just not up to the task.  The largest Active Directory installations in the world have relied on one tool to manage their day-to-day administration tasks: Hyena. Start your trial today.

 
LVL 35

Accepted Solution

by:
sarabande earned 2000 total points
ID: 35016484
error 53 means "bad network path"

the servername passed to NetServerGetInfo must be LPWSTR ( == wchar_t *)  while LPTSTR can be either LPSTR (==char*) or LPWSTR depending on the defined character set of the project. try to pass L"MYSERVER"  to check that issue.

Sara
0
 
LVL 16

Expert Comment

by:sjklein42
ID: 35016503
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[])

Open in new window

0
 
LVL 35

Expert Comment

by:sarabande
ID: 35016590
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
0
 
LVL 4

Expert Comment

by:denissie
ID: 35021922
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.
0
 
LVL 16

Expert Comment

by:sjklein42
ID: 35022135
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
0
 
LVL 16

Expert Comment

by:sjklein42
ID: 35022662
I knew I'd be the fool in this discussion.   Good going sarabande.
0
 
LVL 35

Expert Comment

by:sarabande
ID: 35024967
sjklein42, i like your humour :-)

you rightly stated that marcosborroso used wrong argument wchar_t* as type for second argument.

Sara
0

Featured Post

Has Powershell sent you back into the Stone Age?

If managing Active Directory using Windows Powershell® is making you feel like you stepped back in time, you are not alone.  For nearly 20 years, AD admins around the world have used one tool for day-to-day AD management: Hyena. Discover why.

Question has a verified solution.

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

OfficeMate Freezes on login or does not load after login credentials are input.
While rebooting windows server 2003 server , it's showing "active directory rebuilding indices please wait" at startup. It took a little while for this process to complete and once we logged on not all the services were started so another reboot is …
This tutorial will give a an overview on how to deploy remote agents in Backup Exec 2012 to new servers. Click on the Backup Exec button in the upper left corner. From here, are global settings for the application such as connecting to a remote Back…
This tutorial will walk an individual through the steps necessary to enable the VMware\Hyper-V licensed feature of Backup Exec 2012. In addition, how to add a VMware server and configure a backup job. The first step is to acquire the necessary licen…

719 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