NULLSESS.C
资源名称:MSDN_VC98.zip [点击查看]
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:5k
源码类别:
Windows编程
开发平台:
Visual C++
- /*++
- Copyright 1996 - 1997 Microsoft Corporation
- Module Name:
- nullsess.c
- Abstract:
- This module illustrates how to use a Null session to overcome access
- problems during network related query operations.
- One example of the scenario this approach addresses is as follows:
- User logs onto workstation A as the local administrator.
- Administrator tries to query user information using the NetUserGetInfo()
- API call on server B. This call fails with ERROR_ACCESS_DENIED.
- The reason this problem occurs is that the administrator password on
- workstation A does not match the administrator password on server B.
- During the network query operation, the default behavior is to establish
- a connection to the remote server using the credentials of the logged-in
- user. In some scenarios, this behavior is not appropriate, and the
- solution is to establish a connection using either known credentials,
- or the Null credentials. Null credentials are suitable for most query
- operations against a remote machine. However, if administrator
- related actions are necessary, it is necessary to supply credentials
- which have administrative privilege on the remote machine. Valid
- credentials consist of a username, password, and optional domain name.
- Establishing a connection in this manner requires that no existing
- connections exist to the remote machine tied to the current logon
- session.
- Note: Null sessions are those where the user credentials passed in the
- session setup SMB are null. This sample only implements a function to
- establish a Null session, rather than a session with specific credentials.
- Processes and Services running in the Local System account security context
- have Null credentials by default, so establishing Null sessions in this
- scenario is not required.
- Applications that run only on Windows NT 4.0 and above can use
- WNetAddConnection2() rather than NetUseAdd() to establish a Null session.
- Author:
- Scott Field (sfield) 13-Jun-96
- --*/
- #include <windows.h>
- #include <lm.h>
- #include <stdio.h>
- BOOL
- EstablishNullSession(
- LPCWSTR Server,
- BOOL bEstablish
- );
- #define RTN_OK 0
- #define RTN_USAGE 1
- #define RTN_ERROR 13
- int
- __cdecl
- wmain(
- int argc,
- wchar_t *argv[]
- )
- {
- if(argc != 2) {
- printf("Usage: %ls <\\Server>n", argv[0]);
- return RTN_USAGE;
- }
- //
- // try network operation here. If this fails with an access denied
- // error message, retry the operation using a Null session.
- //
- //
- // establish a session to the target machine with Null credentials
- //
- if(EstablishNullSession( argv[1], TRUE )) {
- //
- // retry network related operation here.
- //
- //
- // break the existing connection we made
- //
- EstablishNullSession( argv[1], FALSE );
- } else {
- //
- // error occurred establishing Null session
- //
- printf("Error establishing Null session! (rc=%lu)n", GetLastError());
- return RTN_ERROR;
- }
- return RTN_OK;
- }
- BOOL
- EstablishNullSession(
- LPCWSTR Server,
- BOOL bEstablish
- )
- {
- LPCWSTR szIpc = L"\IPC$";
- WCHAR RemoteResource[UNCLEN + 5 + 1]; // UNC len + IPC$ + NULL
- DWORD cchServer;
- NET_API_STATUS nas;
- //
- // do not allow NULL or empty server name
- //
- if(Server == NULL || *Server == L' ') {
- SetLastError(ERROR_INVALID_COMPUTERNAME);
- return FALSE;
- }
- cchServer = lstrlenW( Server );
- if(Server[0] != L'\' && Server[1] != L'\') {
- //
- // prepend slashes and NULL terminate
- //
- RemoteResource[0] = L'\';
- RemoteResource[1] = L'\';
- RemoteResource[2] = L' ';
- }
- else {
- cchServer -= 2; // drop slashes from count
- RemoteResource[0] = L' ';
- }
- if(cchServer > CNLEN) {
- SetLastError(ERROR_INVALID_COMPUTERNAME);
- return FALSE;
- }
- if(lstrcatW(RemoteResource, Server) == NULL) return FALSE;
- if(lstrcatW(RemoteResource, szIpc) == NULL) return FALSE;
- //
- // disconnect or connect to the resource, based on bEstablish
- //
- if(bEstablish) {
- USE_INFO_2 ui2;
- ZeroMemory(&ui2, sizeof(ui2));
- ui2.ui2_local = NULL;
- ui2.ui2_remote = (LPTSTR) RemoteResource;
- ui2.ui2_asg_type = USE_IPC;
- ui2.ui2_password = ui2.ui2_username = ui2.ui2_domainname = (LPTSTR) L"";
- nas = NetUseAdd(NULL, 2, (LPBYTE)&ui2, NULL);
- }
- else {
- nas = NetUseDel(NULL, (LPTSTR) RemoteResource, 0);
- }
- if( nas == NERR_Success ) return TRUE; // indicate success
- SetLastError( nas );
- return FALSE;
- }