CHNGPASS.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:6k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*++
  2. Copyright (c) 1995, 1996  Microsoft Corporation
  3. Module Name:
  4.     chngpass.c
  5. Abstract:
  6.     This sample changes the password for an arbitrary user on an arbitrary
  7.     target machine.
  8.     When targetting a domain controller for account update operations,
  9.     be sure to target the primary domain controller for the domain.
  10.     The account settings are replicated by the primary domain controller
  11.     to each backup domain controller as appropriate.  The NetGetDCName()
  12.     Lan Manager API call can be used to get the primary domain controller
  13.     computer name from a domain name.
  14.     Username is argv[1]
  15.     new password is argv[2]
  16.     optional target machine (or domain name) is argv[3]
  17.     optional old password is argv[4].  This allows non-admin password
  18.      changes.
  19.     Note that admin or account operator privilege is required on the
  20.     target machine unless argv[4] is present and represents the correct
  21.     current password.
  22.     NetUserSetInfo() at info-level 1003 is appropriate for administrative
  23.     over-ride of an existing password.
  24.     NetUserChangePassword() allows for an arbitrary user to over-ride
  25.     an existing password providing that the current password is confirmed.
  26.     Link with netapi32.lib
  27. Author:
  28.     Scott Field (sfield)    21-Dec-95
  29. --*/
  30. #include <windows.h>
  31. #include <stdio.h>
  32. #include <lm.h>
  33. #define RTN_OK 0
  34. #define RTN_USAGE 1
  35. #define RTN_ERROR 13
  36. void
  37. DisplayErrorText(
  38.     DWORD dwLastError
  39.     );
  40. //
  41. // Unicode entry point and argv
  42. //
  43. int
  44. __cdecl
  45. wmain(
  46.     int argc,
  47.     wchar_t *argv[]
  48.     )
  49. {
  50.     LPWSTR          wUserName;
  51.     LPWSTR          wComputerName = NULL; // default to local machine
  52.     LPWSTR          wOldPassword;
  53.     LPWSTR          wNewPassword;
  54.     USER_INFO_1003  pi1003;
  55.     NET_API_STATUS  nas;
  56.     if( argc < 3 ) {
  57.         fprintf(stderr, "Usage: %ls <user> <new_password> "
  58.                         "[\\machine | domain] [old_password]n",
  59.                         argv[0]);
  60.         return RTN_USAGE;
  61.     }
  62.     //
  63.     // process command line arguments
  64.     //
  65.     wUserName = argv[1];
  66.     wNewPassword = argv[2];
  67.     if( argc >= 4 && *argv[3] != L'' ) {
  68.         //
  69.         // obtain target machine name, if appropriate
  70.         // always in Unicode, as that is what the API takes
  71.         //
  72.         if(argv[3][0] == L'\' && argv[3][1] == L'\') {
  73.             //
  74.             // target specified machine name
  75.             //
  76.             wComputerName = argv[3];
  77.         }
  78.         else {
  79.             //
  80.             // the user specified a domain name.  Lookup the PDC
  81.             //
  82.             nas = NetGetDCName(
  83.                 NULL,
  84.                 argv[3],
  85.                 (LPBYTE *)&wComputerName
  86.                 );
  87.             if(nas != NERR_Success) {
  88.                 DisplayErrorText( nas );
  89.                 return RTN_ERROR;
  90.             }
  91.         }
  92.     }
  93.     if(argc == 5) {
  94.         wOldPassword = argv[4];
  95.     } else {
  96.         wOldPassword = NULL;
  97.     }
  98.     if(wOldPassword == NULL) {
  99.         //
  100.         // administrative over-ride of existing password
  101.         //
  102.         pi1003.usri1003_password = wNewPassword;
  103.         nas = NetUserSetInfo(
  104.                 wComputerName,  // computer name
  105.                 wUserName,      // username
  106.                 1003,           // info level
  107.                 (LPBYTE)&pi1003,     // new info
  108.                 NULL
  109.                 );
  110.     } else {
  111.         //
  112.         // allows user to change their own password
  113.         //
  114.         nas = NetUserChangePassword(
  115.                 wComputerName,
  116.                 wUserName,
  117.                 wOldPassword,
  118.                 wNewPassword
  119.                 );
  120.     }
  121.     if(wComputerName != NULL && wComputerName != argv[3]) {
  122.         //
  123.         // a buffer was allocated for the PDC name, free it
  124.         //
  125.         NetApiBufferFree(wComputerName);
  126.     }
  127.     if(nas != NERR_Success) {
  128.         DisplayErrorText( nas );
  129.         return RTN_ERROR;
  130.     }
  131.     return RTN_OK;
  132. }
  133. void
  134. DisplayErrorText(
  135.     DWORD dwLastError
  136.     )
  137. {
  138.     HMODULE hModule = NULL; // default to system source
  139.     LPSTR MessageBuffer;
  140.     DWORD dwBufferLength;
  141.     DWORD dwFormatFlags;
  142.     dwFormatFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER |
  143.                     FORMAT_MESSAGE_IGNORE_INSERTS |
  144.                     FORMAT_MESSAGE_FROM_SYSTEM ;
  145.     //
  146.     // if dwLastError is in the network range, load the message source
  147.     //
  148.     if(dwLastError >= NERR_BASE && dwLastError <= MAX_NERR) {
  149.         hModule = LoadLibraryEx(
  150.             TEXT("netmsg.dll"),
  151.             NULL,
  152.             LOAD_LIBRARY_AS_DATAFILE
  153.             );
  154.         if(hModule != NULL)
  155.             dwFormatFlags |= FORMAT_MESSAGE_FROM_HMODULE;
  156.     }
  157.     //
  158.     // call FormatMessage() to allow for message text to be acquired
  159.     // from the system or the supplied module handle
  160.     //
  161.     if(dwBufferLength = FormatMessageA(
  162.         dwFormatFlags,
  163.         hModule, // module to get message from (NULL == system)
  164.         dwLastError,
  165.         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // default language
  166.         (LPSTR) &MessageBuffer,
  167.         0,
  168.         NULL
  169.         ))
  170.     {
  171.         DWORD dwBytesWritten;
  172.         //
  173.         // Output message string on stderr
  174.         //
  175.         WriteFile(
  176.             GetStdHandle(STD_ERROR_HANDLE),
  177.             MessageBuffer,
  178.             dwBufferLength,
  179.             &dwBytesWritten,
  180.             NULL
  181.             );
  182.         //
  183.         // free the buffer allocated by the system
  184.         //
  185.         LocalFree(MessageBuffer);
  186.     }
  187.     //
  188.     // if we loaded a message source, unload it
  189.     //
  190.     if(hModule != NULL)
  191.         FreeLibrary(hModule);
  192. }