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

Windows编程

开发平台:

Visual C++

  1. /*++
  2. Copyright 1996 - 1997 Microsoft Corporation
  3. Module Name:
  4.     nullsess.c
  5. Abstract:
  6.     This module illustrates how to use a Null session to overcome access
  7.     problems during network related query operations.
  8.     One example of the scenario this approach addresses is as follows:
  9.     User logs onto workstation A as the local administrator.
  10.     Administrator tries to query user information using the NetUserGetInfo()
  11.     API call on server B.  This call fails with ERROR_ACCESS_DENIED.
  12.     The reason this problem occurs is that the administrator password on
  13.     workstation A does not match the administrator password on server B.
  14.     During the network query operation, the default behavior is to establish
  15.     a connection to the remote server using the credentials of the logged-in
  16.     user.  In some scenarios, this behavior is not appropriate, and the
  17.     solution is to establish a connection using either known credentials,
  18.     or the Null credentials.  Null credentials are suitable for most query
  19.     operations against a remote machine.  However, if administrator
  20.     related actions are necessary, it is necessary to supply credentials
  21.     which have administrative privilege on the remote machine.  Valid
  22.     credentials consist of a username, password, and optional domain name.
  23.     Establishing a connection in this manner requires that no existing
  24.     connections exist to the remote machine tied to the current logon
  25.     session.
  26.     Note: Null sessions are those where the user credentials passed in the
  27.     session setup SMB are null.  This sample only implements a function to
  28.     establish a Null session, rather than a session with specific credentials.
  29.     Processes and Services running in the Local System account security context
  30.     have Null credentials by default, so establishing Null sessions in this
  31.     scenario is not required.
  32.     Applications that run only on Windows NT 4.0 and above can use
  33.     WNetAddConnection2() rather than NetUseAdd() to establish a Null session.
  34. Author:
  35.     Scott Field (sfield)    13-Jun-96
  36. --*/
  37. #include <windows.h>
  38. #include <lm.h>
  39. #include <stdio.h>
  40. BOOL
  41. EstablishNullSession(
  42.     LPCWSTR Server,
  43.     BOOL bEstablish
  44.     );
  45. #define RTN_OK 0
  46. #define RTN_USAGE 1
  47. #define RTN_ERROR 13
  48. int
  49. __cdecl
  50. wmain(
  51.     int argc,
  52.     wchar_t *argv[]
  53.     )
  54. {
  55.     if(argc != 2) {
  56.         printf("Usage: %ls <\\Server>n", argv[0]);
  57.         return RTN_USAGE;
  58.     }
  59.     //
  60.     // try network operation here.  If this fails with an access denied
  61.     // error message, retry the operation using a Null session.
  62.     //
  63.     //
  64.     // establish a session to the target machine with Null credentials
  65.     //
  66.     if(EstablishNullSession( argv[1], TRUE )) {
  67.         //
  68.         // retry network related operation here.
  69.         //
  70.         //
  71.         // break the existing connection we made
  72.         //
  73.         EstablishNullSession( argv[1], FALSE );
  74.     } else {
  75.         //
  76.         // error occurred establishing Null session
  77.         //
  78.         printf("Error establishing Null session! (rc=%lu)n", GetLastError());
  79.         return RTN_ERROR;
  80.     }
  81.     return RTN_OK;
  82. }
  83. BOOL
  84. EstablishNullSession(
  85.     LPCWSTR Server,
  86.     BOOL bEstablish
  87.     )
  88. {
  89.     LPCWSTR szIpc = L"\IPC$";
  90.     WCHAR RemoteResource[UNCLEN + 5 + 1]; // UNC len + IPC$ + NULL
  91.     DWORD cchServer;
  92.     NET_API_STATUS nas;
  93.     //
  94.     // do not allow NULL or empty server name
  95.     //
  96.     if(Server == NULL || *Server == L'') {
  97.         SetLastError(ERROR_INVALID_COMPUTERNAME);
  98.         return FALSE;
  99.     }
  100.     cchServer = lstrlenW( Server );
  101.     if(Server[0] != L'\' && Server[1] != L'\') {
  102.         //
  103.         // prepend slashes and NULL terminate
  104.         //
  105.         RemoteResource[0] = L'\';
  106.         RemoteResource[1] = L'\';
  107.         RemoteResource[2] = L'';
  108.     }
  109.     else {
  110.         cchServer -= 2; // drop slashes from count
  111.         RemoteResource[0] = L'';
  112.     }
  113.     if(cchServer > CNLEN) {
  114.         SetLastError(ERROR_INVALID_COMPUTERNAME);
  115.         return FALSE;
  116.     }
  117.     if(lstrcatW(RemoteResource, Server) == NULL) return FALSE;
  118.     if(lstrcatW(RemoteResource, szIpc) == NULL) return FALSE;
  119.     //
  120.     // disconnect or connect to the resource, based on bEstablish
  121.     //
  122.     if(bEstablish) {
  123.         USE_INFO_2 ui2;
  124.         ZeroMemory(&ui2, sizeof(ui2));
  125.         ui2.ui2_local = NULL;
  126.         ui2.ui2_remote = (LPTSTR) RemoteResource;
  127.         ui2.ui2_asg_type = USE_IPC;
  128.         ui2.ui2_password = ui2.ui2_username = ui2.ui2_domainname = (LPTSTR) L"";
  129.         nas = NetUseAdd(NULL, 2, (LPBYTE)&ui2, NULL);
  130.     }
  131.     else {
  132.         nas = NetUseDel(NULL, (LPTSTR) RemoteResource, 0);
  133.     }
  134.     if( nas == NERR_Success ) return TRUE; // indicate success
  135.     SetLastError( nas );
  136.     return FALSE;
  137. }