⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 netdiskdlg.cpp

📁 映射webdav服务器目录到本地
💻 CPP
字号:
// netdiskDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "netdisk.h"
#include "netdiskDlg.h"
#include "Winnetwk.h"
#include "winsvc.h"
//#include "Wincrypt.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// 对话框数据
	enum { IDD = IDD_ABOUTBOX };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()


// CnetdiskDlg 对话框




CnetdiskDlg::CnetdiskDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CnetdiskDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CnetdiskDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CnetdiskDlg, CDialog)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
	ON_BN_CLICKED(IDOK, &CnetdiskDlg::OnBnClickedOk)
	ON_BN_CLICKED(ID_BTN_DISCONNECT, &CnetdiskDlg::OnBnClickedBtnDisconnect)
END_MESSAGE_MAP()


// CnetdiskDlg 消息处理程序

BOOL CnetdiskDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// 将“关于...”菜单项添加到系统菜单中。

	// IDM_ABOUTBOX 必须在系统命令范围内。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码
	CEdit* pEditWnd = (CEdit*)GetDlgItem( IDC_EDIT_REMOTE_NAME ) ;
	pEditWnd->SetWindowText( L"http://192.168.1.125/uploads" ) ;

	pEditWnd = (CEdit*)GetDlgItem( IDC_EDIT_USER_NAME ) ;
	pEditWnd->SetWindowText( L"qa" ) ;
	pEditWnd = (CEdit*)GetDlgItem( IDC_EDIT_PASSWORD ) ;
	pEditWnd->SetWindowText( L"pass" ) ;
	pEditWnd = (CEdit*)GetDlgItem( IDC_EDIT_LOCAL_DRIVER_NAME ) ;
	pEditWnd->SetWindowText( L"Y:" ) ;

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CnetdiskDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CnetdiskDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标显示。
//
HCURSOR CnetdiskDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}


void CnetdiskDlg::OnBnClickedOk()
{
	// TODO: 在此添加控件通知处理程序代码
	//OnOK();
	TCHAR* lpProvidorName ;
	lpProvidorName = NULL ;
	DWORD dwLength = 0 ;
	DWORD dwRet  ; 

	CString strRemoteName , strUserName , strPassword , strDriverName ;

	CEdit* pEditWnd = (CEdit*)GetDlgItem( IDC_EDIT_REMOTE_NAME ) ;
	pEditWnd->GetWindowText( strRemoteName ) ;
	pEditWnd = (CEdit*)GetDlgItem( IDC_EDIT_USER_NAME ) ;
	pEditWnd->GetWindowText( strUserName ) ;
	pEditWnd = (CEdit*)GetDlgItem( IDC_EDIT_PASSWORD ) ;
	pEditWnd->GetWindowText( strPassword ) ;
	pEditWnd = (CEdit*)GetDlgItem( IDC_EDIT_LOCAL_DRIVER_NAME ) ;
	pEditWnd->GetWindowText( strDriverName ) ;


	
	dwRet = WNetGetProviderName( WNNC_NET_DAV , lpProvidorName , &dwLength ) ;
	if( dwLength > 0 )
	{
		lpProvidorName = (TCHAR*)new TCHAR[dwLength ] ;
		WNetGetProviderName( WNNC_NET_DAV , lpProvidorName , &dwLength ) ;
	}
	else
	{
		TRACE("WNetGetProviderName, ERROR : %ld\n" , dwRet ) ;
	}
	NETRESOURCE  nres ;
	memset( &nres, 0 , sizeof( NETRESOURCE ) ) ;
	nres.dwScope = RESOURCE_REMEMBERED ;
	nres.dwType = RESOURCETYPE_DISK ;
	nres.dwDisplayType = RESOURCEDISPLAYTYPE_SHARE ;
	nres.dwUsage = 0 ; //RESOURCEUSAGE_CONNECTABLE ;

	nres.lpLocalName = strDriverName.GetBuffer() ;
	nres.lpRemoteName = strRemoteName.GetBuffer() ;
	nres.lpProvider = NULL ;// lpProvidorName  ;

	//CONNECTDLGSTRUCT  connstru ;
	//memset( &connstru , 0 , sizeof( CONNECTDLGSTRUCT )) ;
	//connstru.cbStructure = sizeof( CONNECTDLGSTRUCT ) ;
	//connstru.hwndOwner = m_hWnd ; 
	//connstru.lpConnRes = &nres ;
	//connstru.dwFlags = CONNDLG_NOT_PERSIST ;
	//dwRet =  WNetConnectionDialog1(
	//	&connstru 
	//	);


	CheckBasicAuth() ; 


	//strUserName = L"192.168.1.125\\" + strUserName ;
	//HCERTSTORE  hSystemStore;              // system store handle
	//if(hSystemStore = CertOpenSystemStore(
	//	0,
	//	L"CA"))
	//{
	//	TRACE("The CA system store is open. Continue.\n");
	//}
	//else
	//{
	//	TRACE("The CA system store did not open.\n");
	//}


	dwRet = WNetAddConnection3(  m_hWnd ,
									&nres ,
									strPassword.GetBuffer( ) ,
									strUserName.GetBuffer( ) ,
									CONNECT_REDIRECT | CONNECT_UPDATE_PROFILE | CONNECT_CMD_SAVECRED
		) ;
	if( dwRet == 5 )
	{
		Sleep( 1000 ) ;
		dwRet = WNetAddConnection3(  m_hWnd ,
		&nres ,
		strPassword.GetBuffer( ) ,
		strUserName.GetBuffer( ) ,
		CONNECT_REDIRECT | CONNECT_UPDATE_PROFILE
		) ;
	}

	if( dwLength )
	{
		delete lpProvidorName ;
	}
	if( dwRet != NO_ERROR  )
	{
		CString strMsg ;
		CString strErrorMsg ;
		GetErrorMsg( dwRet , strErrorMsg ) ;
		TRACE( L"Connect error : %ld \n" , dwRet ) ;
		strMsg.Format( L"Map driver error.%s" , strErrorMsg ) ;
		MessageBox( strMsg) ;
	}
	else
	{
		MessageBox( L"Map driver success.") ;
		m_strLocalDriver = strDriverName ;
		
	}
	//if(!CertCloseStore(hSystemStore, 0))
	//{
	//	TRACE("Unable to close the CA system store.\n");
	//}
}

void CnetdiskDlg::OnBnClickedBtnDisconnect()
{
	CString strDriverName ;
	CEdit* pEditWnd = (CEdit*)GetDlgItem( IDC_EDIT_LOCAL_DRIVER_NAME ) ;
	pEditWnd->GetWindowText( strDriverName ) ;

	WNetCancelConnection2( strDriverName , CONNECT_UPDATE_PROFILE, TRUE )  ;
}

void CnetdiskDlg::GetErrorMsg( DWORD dwErrorCode , CString &szMsg) 
{ 
	LPVOID lpMsgBuf;

	FormatMessage(
		FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
		NULL,
		dwErrorCode ,
		MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
		(LPTSTR) &lpMsgBuf,
		0, NULL );

	szMsg.Append( (LPWSTR)lpMsgBuf ) ; 

	LocalFree(lpMsgBuf);
}
void CnetdiskDlg::CheckBasicAuth() 
{
	LONG lReturn = 0 ;
	BOOL bNeedRestar = FALSE ;
	DWORD dwDisp = REG_OPENED_EXISTING_KEY | REG_CREATED_NEW_KEY ;
	HKEY  hk ;
	DWORD dwValue = 0 ;
	DWORD dwType = REG_DWORD ;
	DWORD dwValueSize = sizeof( DWORD ) ;
	lReturn = RegCreateKeyEx( HKEY_LOCAL_MACHINE , 
							L"SYSTEM\\CurrentControlSet\\Services\\WebClient\\Parameters" ,
							0, NULL, REG_OPTION_NON_VOLATILE,
							KEY_ALL_ACCESS, NULL, &hk, &dwDisp
							) ;
	TRACE( "CheckBasicAuth.open reg key : %ld \n" , lReturn  ) ;
	if( lReturn != ERROR_SUCCESS )
		return ;

	lReturn = RegQueryValueEx( hk , L"UseBasicAuth" , NULL , &dwType , (LPBYTE)&dwValue , &dwValueSize) ;
	TRACE( "CheckBasicAuth.RegQueryValueEx : %ld \n" , lReturn  ) ;
	if( lReturn == 0x0002 || lReturn == ERROR_SUCCESS && dwValue != 2 ) //没有找到或不是2
	{
		/*
		禁用基本身份验证 HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows \CurrentVersion\ Internet Settings\DisableBasicOverClearChannel 
		SYSTEM\\CurrentControlSet\\Services\\WebClient\\Parameters\\UseBasicAuth
		0 - 禁用基本身份验证 
		对 SSL 共享只启用 1 基本验证 
		 两个或更高 - 用于 SSL 共享和非 SSL 共享启用基本验证 
		*/
		dwValue = 2 ; 
		lReturn = RegSetValueEx( hk,      // subkey handle 
			L"UseBasicAuth",  // value name 
			0,                 // must be zero 
			REG_DWORD,         // value type 
			(LPBYTE) &dwValue,  // pointer to value data 
			sizeof(DWORD)) ;    // length of value data 
		TRACE( "CheckBasicAuth.RegSetValueEx : %ld \n" , lReturn  ) ;
		if( lReturn == ERROR_SUCCESS )
		{
			bNeedRestar = TRUE ; 
		}
	}

	RegCloseKey(hk);  

	lReturn = RegCreateKeyEx( HKEY_LOCAL_MACHINE , 
		L"SYSTEM\\CurrentControlSet\\Services\\WebClient" ,
		0, NULL, REG_OPTION_NON_VOLATILE,
		KEY_ALL_ACCESS, NULL, &hk, &dwDisp
		) ;
	TRACE( "CheckBasicAuth.open reg key : %ld \n" , lReturn  ) ;
	if( lReturn != ERROR_SUCCESS )
		return ;

	lReturn = RegQueryValueEx( hk , L"Start" , NULL , &dwType , (LPBYTE)&dwValue , &dwValueSize) ;
	TRACE( "CheckBasicAuth.RegQueryValueEx : %ld \n" , lReturn  ) ;
	if( lReturn == ERROR_SUCCESS && dwValue != 2 ) //没有找到或不是2-自动
	{
		dwValue = 2 ; 
		lReturn = RegSetValueEx( hk,      // subkey handle 
			L"Start",  // value name 
			0,                 // must be zero 
			REG_DWORD,         // value type 
			(LPBYTE) &dwValue,  // pointer to value data 
			sizeof(DWORD)) ;    // length of value data 
		TRACE( "CheckBasicAuth.RegSetValueEx : %ld \n" , lReturn  ) ;
		if( lReturn == ERROR_SUCCESS )
		{
			StartNeedService( L"MRxDAV" ) ;
			StartNeedService( L"WebClient" ) ;
		}
	}

	RegCloseKey(hk);  

	if( bNeedRestar )
	{
		StopService( L"WebClient" ) ;
		StopService( L"MRxDAV" ) ;
	}
	StartNeedService( L"MRxDAV" ) ;
	StartNeedService( L"WebClient" ) ;
}

BOOL CnetdiskDlg::StartNeedService( LPCTSTR lpServerName ) 
{
	DWORD dwLastError ;
	SC_HANDLE schSCManager = OpenSCManager( 
		NULL,                    // local machine 
		NULL,                    // ServicesActive database 
		SC_MANAGER_ALL_ACCESS);  // full access rights 

	if( schSCManager == NULL )
	{
		dwLastError = GetLastError();
		return FALSE ;
	}
	SERVICE_STATUS ssStatus; 

	SC_HANDLE schService = OpenService( 
		schSCManager,          // SCM database 
		lpServerName ,          // service name
		SERVICE_ALL_ACCESS); 
	if( schService == NULL )
	{
		dwLastError = GetLastError();
		TRACE( L"StartService.%s,errorcode:%ld\n" , lpServerName , dwLastError ) ;
		return FALSE ;
	}
	if ( QueryServiceStatus( 	schService,   // handle to service 
		&ssStatus) )  // address of status information structure
	{

		if( ssStatus.dwCurrentState == SERVICE_STOPPED )
		{
			//启动Service
			if( ! StartService( schService , 0 , NULL ) )
			{
				dwLastError = GetLastError();
				TRACE( L"StartService.%s,errorcode:%ld\n" , lpServerName , dwLastError ) ;
				return FALSE ;
			}
			int count = 0 ;
			while( true)
			{
				ControlService( schService ,  SERVICE_CONTROL_INTERROGATE ,   &ssStatus ) ;
				if( ssStatus.dwCurrentState == SERVICE_RUNNING )
					break; 
				Sleep( 1000 ) ;
				count ++ ; 
				if( count > 60)
					break ;
			}
		}
	}
	CloseServiceHandle( schService ) ; 
	CloseServiceHandle( schSCManager ) ; 
	if( ssStatus.dwCurrentState == SERVICE_RUNNING )
		return TRUE ;
	else
		return FALSE ;
}	
BOOL CnetdiskDlg::StopService(LPCTSTR lpServerName ) 
{
	DWORD dwLastError ;
	SC_HANDLE schSCManager = OpenSCManager( 
		NULL,                    // local machine 
		NULL,                    // ServicesActive database 
		SC_MANAGER_ALL_ACCESS);  // full access rights 

	if( schSCManager == NULL )
	{
		dwLastError = GetLastError();
		return FALSE ;
	}
	SERVICE_STATUS ssStatus; 

	SC_HANDLE schService = OpenService( 
		schSCManager,          // SCM database 
		lpServerName ,          // service name
		SERVICE_ALL_ACCESS); 
	if( schService == NULL )
	{
		dwLastError = GetLastError();
		return FALSE ;
	}
	if ( QueryServiceStatus( 	schService,   // handle to service 
		&ssStatus) )  // address of status information structure
	{

		if( ssStatus.dwCurrentState == SERVICE_RUNNING )
		{
			//停止Service
			if( ! ControlService( schService ,  SERVICE_CONTROL_STOP ,   &ssStatus ) )
			{
				dwLastError = GetLastError();
				TRACE( L"StopService.%s,errorcode:%ld\n" , lpServerName , dwLastError ) ;
				return FALSE ;
			}

			int count = 0 ;
			while( true)
			{
				ControlService( schService ,  SERVICE_CONTROL_INTERROGATE ,   &ssStatus ) ;
				if( ssStatus.dwCurrentState == SERVICE_STOPPED )
					break; 
				Sleep( 1000 ) ;
				count ++ ; 
				if( count > 60)
					break ;
			}
		}
	}
	CloseServiceHandle( schService ) ; 
	CloseServiceHandle( schSCManager ) ; 
	if( ssStatus.dwCurrentState == SERVICE_STOPPED )
		return TRUE ;
	else
		return FALSE ;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -