NetUserValidate2() Usage Sample Program (62561)



The information in this article applies to:

  • Microsoft LAN Manager 2.0
  • Microsoft LAN Manager 2.1
  • Microsoft LAN Manager 2.1a
  • Microsoft LAN Manager 2.2

This article was previously published under Q62561

SUMMARY

The following program demonstrates the correct usage of the NetUserValidate2() function call:
    /* This program demonstrates the usage of NetUservalidate2().

      Compile option: CL -C -W3 -Zi validat2.c
      Link option: Link /CO validat2,,,os2+netapi;
      Usage:
               validate <username> <password>

      The program fills in the workstation name by making a call to
      NetWkstaGetInfo(). A value of NULL in the workstation field will
      mean local workstation.

      This software is provided for demonstration purposes only.
      Microsoft makes no warranty, either express or implied, as to its
      usability in any given situation.

   */ 

   #define INCL_DOS
   #define INCL_NOPM
   #include <os2.h>

   #include <netcons.h>
   #include <neterr.h>
   #include <access.h>
   #include <wksta.h>
   #include <lan.h>

   #include <stdio.h>
   #include <malloc.h>
   #include <string.h>
   #include <ctype.h>

   #define EXTRA_USER_INFO     200
   #define EXTRA_WKSTA_INFO    70
   #define TOTAL_DOMAIN_NMS    32

   typedef struct user_info_1 USER_INFO_1;
   typedef struct wksta_info_10 WKSTA_INFO_10;
   typedef struct user_logon_req_1  User_Logon_Req_1;
   typedef struct user_logon_info_1 User_Logon_Info_1;

   typedef char far        * CHFP;
   typedef char near       * CHNP;
   typedef  unsigned short US;

   void MtrCpy ( char  *dest, char  far *src);

   /* MtrCpy() function will copy text from far buffer into near buffer.
    */ 

   void MtrCpy ( char  *dest, char  far *src)
   {
       char  *pDest = dest;
       char far *pSrc = src;

       // Copy from far buffer into near buffer.

       while ( *pSrc)
           *pDest++ = *pSrc++;
       *pDest = '\0';

       // Uppercase the text. Password must be uppercased.

       pDest = dest;
       while (*pDest) {
           if ( isalpha( (int) *pDest))
               *pDest = (char) toupper( (int) *pDest);
           pDest++;

       }


   return;
   }

   void main(argc, argv)
   int argc;
   char *argv[];
   {

       char   *pUserInfo;          /* Pointer to user_info_10.     */ 
       WKSTA_INFO_10 *pWkstaInfo;  /* Pointer to wksta_info_10.    */ 

       User_Logon_Info_1 *pUserLogonInfo;
       User_Logon_Req_1  *pUserReq;

       unsigned int netAPIStatus;         /* Status from LANMAN calls.  */ 
       unsigned short int returnedBuffSz; /* Size of buffer from LANMAN
                                             calls. */ 

       if ( argc < 2 ) {
           puts("USAGE: username password");
           return;
       }

           /* Allocate buffer for level 10 workstation information. */ 
       if ( (pWkstaInfo = (WKSTA_INFO_10 *)calloc(1, sizeof(WKSTA_INFO_10)
                                                  + EXTRA_WKSTA_INFO
                                                  + TOTAL_DOMAIN_NMS))
                                                  == NULL) {

           puts("Error: Unable to allocate workstation info buffer");
           return;
       }

           /* Get the workstation information. */ 
       if ( netAPIStatus = NetWkstaGetInfo(NULL, 10, (CHFP) pWkstaInfo,
                                           (sizeof(WKSTA_INFO_10) +
                                            EXTRA_WKSTA_INFO +
                                            TOTAL_DOMAIN_NMS),
                                            &returnedBuffSz) ) {

           printf("Error: NetWkstaGetInfo() returned %u\n");
           free(pWkstaInfo);
           return;
       }

           /* Allocate buffer for level 1 user logon information. */ 
       if ( (pUserReq = (User_Logon_Req_1 *)calloc(1, sizeof(USER_INFO_1)
                                                  + EXTRA_USER_INFO))
                                                  == NULL) {

           puts("Error: Unable to allocate user logon buffer");
           return;
       }

           /* Initialize user information with user ID from workstation
              call.
            */ 


       MtrCpy( pUserReq->usrreq1_name,   argv[1]);   // Username
       MtrCpy(pUserReq->usrreq1_password, argv[2]);  // Password
                                                      // Workstation Name
       pUserReq->usrreq1_workstation =  pWkstaInfo->wki10_computername;

       free(pWkstaInfo);          /* Information not needed anymore.  */ 

       printf("\nValidating user %s, password %s\n",
              pUserReq->usrreq1_name, pUserReq->usrreq1_password);

           /* Call LANMAN to validate ID and password. */ 
       netAPIStatus = NetUserValidate2(NULL, 1, (CHFP) pUserReq,
                                    (sizeof(USER_INFO_1) + EXTRA_USER_INFO)
                                    (US) NULL, &returnedBuffSz);
       if ( netAPIStatus ) {              /* Report results of call.    */ 
           printf("\n\tError calling NetUserValidate, status = %u\n",
                  netAPIStatus);
       }
       else {
           /* While making the NetUserValidate2() call, the pointer
              pUserReq must point to a user_info_req_1 type structure and
              on a successful return, the same pointer now points to the
              user_logon_info_1 type structure.
           */ 
           pUserLogonInfo = (User_Logon_Info_1 *) pUserReq;
           printf("Validatation Code: %d\n", pUserLogonInfo->usrlog1_code);

           printf("\n\tUser %s validated, has privilege level",
               pUserLogonInfo->usrlog1_eff_name);

           switch ( pUserLogonInfo->usrlog1_priv ) {

           case USER_PRIV_GUEST:
               puts(" GUEST.");
               break;

           case USER_PRIV_USER:
               puts(" USER.");
               break;

           case USER_PRIV_ADMIN:
               puts(" ADMIN.");
               break;

           default:
               printf(" unknown privilege level = %d\n",
                   pUserLogonInfo->usrlog1_priv);
               break;

           }   /* End-switch on user privilege level. */ 

       }   /* End-if on netAPIStatus. */ 

       free(pUserInfo);        /* Information not needed anymore.  */ 
       return;
   }
				

Modification Type:MajorLast Reviewed:9/30/2003
Keywords:KB62561