📄 netdiskdlg.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 + -