解决问题者给100分 写注册表HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 共享/删除共享可以直接调用标准的Win32API函数 NetShareAdd()和NetShareDel()。 建立共享目录函数:Function NetShareAdd(servername:PChar; level:SmallInt;buf:Pointer; buf_len:SmallInt):SmallInt;far;stdcall;external 'svrapi.dll'; 撤销共享目录函数:Function NetShareDel(servername:PChar;buf:Pointer; reserved:SmallInt):SmallInt;far;stdcall;external 'svrapi.dll'; 这里再提供两个关于连接共享目录/撤销共享目录函数WnetAddConnection和WnetCancelConnection。 关于映射网络驱动器的方法如下: WNetAddConnection(%共享目录名%,%口令%,'X:'); //映射X盘 WNetCancelConnection('X:',True); //撤销X盘映射 关于建立/撤消共享的函数返回变量说明如下: const NETNAME_LEN = 13;PASSWORD_LEN = 9;SHI50F_RDONLY = $0001; SHI50F_FULL = $0002;SHI50F_DEPENDSON = $0003; SHI50F_ACCESSMASK = $0003;SHI50F_PERSIST = $0100; SHI50F_SYSTEM = $0200;STYPE_DISKTREE = 0; STYPE_PRINTQ = 1;STYPE_DEVICE = 2; STYPE_IPC = 3;NERR_Success = 0; NERR_BASE = 2100; //常量说明 NERR_UnKnownDevDir=(NERR_BASE+16);NERR_UnknownServer=(NERR_BASE+3); NERR_ServerNotStarted=(NERR_BASE+14);NERR_RedirectedPath=(NERR_BASE+17); NERR_DuplicateShare=(NERR_BASE+18);NERR_BufTooSmalll=(NERR_BASE+23); //NetShareAdd返回错误 NERR_NetNotStarted = (NERR_BASE+2); NERR_ServerNotStarted = (NERR_BASE+14); NERR_NetNameNotFound = (NERR_BASE+210); NERR_ShareNotFound = (NERR_BASE+292); //NetShareDel返回错误 SHARE_INFO_50=Record netname:array [0..NETNAME_LEN-1] of Char; sharetype:ShortInt; flags:SmallInt; re:PChar; path:PChar; rw_password:array [0..PASSWORD_LEN-1] of Char; ro_password:array [0..PASSWORD_LEN-1] of Char; End; //以上为类型定义 再有就是关于Window9X共享目录口令问题(其实屏保口令也是同样保存的),口令(原始为十六进制字符) 在注册表位置Y_LOCAL_MACHINE\SOFTWARE\micorsoft\windows\current_version\network\lanman\共 享文件夹名\Parm1enc和Parm2enc两位置,Parm1enc为对应的是完全共享密码,Parm2enc对应的是只读共 享密码。字符与数列(前八个数是35,9A,4D,A6,53,A9,D4,6A)作异或运算即得密码的二进制ASCII码,转换 后可得到密码。 另外提供一个比较幼稚但可行的方案(在注册表做动作): var reg : TRegistry; name : String; //s是在网上邻居里的文件夹名 begin name := 'DirName';//建立一个只读,无密码共享目录 reg := TRegistry.Create; reg.RootKey := HKEY_LOCAL_MACHINE; reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Network\LanMan\'+name,true ); reg.WriteInteger( 'Flags', 401 ) ; //权限:401代表为访问,258为完全访问,259为密码访问 reg.WriteInteger( 'Parm1enc', 0 ) ; //参数2,放置完全访问密码,已加密 reg.WriteInteger( 'Parm2enc', 0 ) ; //参数2,放置只读访问密码,已加密 reg.WriteString( 'Path', 'C:\MYDIR' ) ; //放置要共享的目录的绝对路径 reg.WriteString( 'Re', '' ) ; reg.WriteInteger( 'Type', 0 ) ; end; 这样的缺点就是要重启系统,可以ExitWindowsEx( EWX_FORCE and EWX_SHUTDOWN , 0 )来重启。 此外你还可以使用控件File Sharing 95/98,该控件包含了几个方便的function:ShareResource、DeleteShare、GetShareInfo、 SetShareInfo、GetNetErrorString等。 附:关于NetUserAdd等相关API WNetCloseEnum 结束网络资源列表 WNetConnectionDialog 开始网络连接对话框 WNetDisconnectDialog 断开网络对话框 WNetEnumResource 继续列表网络资源 WNetGetConnection 获取网络资源名 WNetGetLastError 返回网络函数最近错误 WNetGetUser 获取当前网络用户名 WNetOpenEnum 列出网络资源 下载sdk安装之后,请察看sample\start下的例子,比较简单,还有一个adsi25.chm是帮助文件download:http://www.microsoft.com/NTWorkstation/downloads/Other/ADSI25.aspIntel Version (English Language) (http://download.microsoft.com/download/winntwks40/Install/2.5/nt4/en-us/ads.exe)ADSI 2.5 SDK (English Language) (http://download.microsoft.com/download/winntwks40/sdk/2.5/nt4/en-us/sdk.exe)#include "activeds.h"bool CreateVirtualDirectory( LPWSTR wszWebDir, LPWSTR wszVirDirName, LPWSTR wszVirDirPath ){ bool bReturn = false; IADs *pParentADs=NULL; HRESULT hr = ADsGetObject( wszWebDir ,IID_IADs,(void**)&pParentADs); if( hr == S_OK ) { IADsContainer *container; if( pParentADs->QueryInterface(IID_IADsContainer,(void**)&container) == S_OK ) { IDispatch *object=NULL; IADs *pChildADs=NULL; hr = container->Create( L"IIsWebVirtualDir", wszVirDirName, &object); if(hr == S_OK) { hr = object->QueryInterface(IID_IADs,(void**)&pChildADs); object->Release(); VARIANT var; VariantInit(&var); V_BSTR(&var) = SysAllocString( wszVirDirPath ); V_VT(&var) = VT_BSTR; hr=pChildADs->Put( L"path", var ); VariantClear(&var); V_BSTR(&var) = SysAllocString( wszVirDirName ); V_VT(&var) = VT_BSTR; hr=pChildADs->Put( L"AppFriendlyName", var ); VariantClear(&var); hr=pChildADs->SetInfo(); hr=pChildADs->Release(); bReturn = true; } container->Release(); } pParentADs->Release(); } return bReturn;}bool RemoveVirtualDirectory( LPWSTR wszWebDir, LPWSTR wszVirDirName ){ bool bReturn = false; IADs *pParentADs=NULL; HRESULT hr = ADsGetObject( wszWebDir ,IID_IADs,(void**)&pParentADs); if( hr == S_OK ) { IADsContainer *container; if( pParentADs->QueryInterface(IID_IADsContainer,(void**)&container) == S_OK ) { IDispatch *object=NULL; IADs *pChildADs=NULL; hr = container->Delete( L"IIsWebVirtualDir", wszVirDirName ); if(hr == S_OK) { bReturn = true; } container->Release(); } pParentADs->Release(); } return bReturn;}int main(int argc, char* argv[]){ CoInitialize(NULL); bool b; b = CreateVirtualDirectory( L"IIS://LOCALHOST/W3SVC/1/Root", L"test", L"f:\\temp1" ); printf("\n%d", b); b = RemoveVirtualDirectory( L"IIS://LOCALHOST/W3SVC/1/Root", L"test" ); printf("\n%d", b); CoUninitialize(); return 0;} pinel() 这个只能实现文件夹的共享,而不是web共享,二者是有区别的! 我在添几句:我的目的是在:“默认的web站点” 下添加 一虚拟目录我这儿一段源程序://****************************** 在Visual C++中使用ADSI,需要#include activeds.h,连接activeds.lib和adsiid.lib库文件,并要使用Unicode字符串。这个例子是使用VC在默认Web站点建立的虚拟目录。///////////////////////////////////////////////// CreateVirtualDirection参数说明// lpszVirtualDirName需要建立的虚拟目录的目录名字// lpszDiskPath 需要建立虚拟目录的本地磁盘目录//////////////////////////////////////////////BOOL CreateVirtualDirection(LPCTSTR lpszVirtualDirName,LPCTSTR lpszDiskPath){IADsContainer* iContainer;IADs* iAds;/* 获得WebSever */ if(ADsGetObject(L"IIS://localhost/w3svc",IID_IADsContainer,(void**)&iContainer)==S_OK) {//等到默认站点 iContainer->GetObject(_bstr_t("IIsWebServer"), _bstr_t("1"),(IDispatch**)&iAds);if(iAds->QueryInterface(IID_IADsContainer,(void**)&iContainer)==S_OK){//得到默认站点的根目录iContainer->GetObject(_bstr_t("IIsWebVirtualDir"),_bstr_t("Root"),(IDispatch**)&iAds);//获得访问虚拟目录if(iAds->QueryInterface(IID_IADsContainer,(void**)&iContainer)==S_OK){//先删除了虚拟目录 iContainer->Delete(_bstr_t("IIsWebVirtualDir"), _bstr_t(lpszVirtualDirName));//建立虚拟目录 if(iContainer->Create(_bstr_t("IIsWebVirtualDir"), _bstr_t(lpszVirtualDirName),(IDispatch**)&iAds)==S_OK){//设置虚拟目录的属性 iAds->Put(_bstr_t("AccessRead"),_variant_t("True"));//注意跟VB中的设置属性比较iAds->Put(_bstr_t("AccessWrite"),_variant_t("True"));iAds->Put(_bstr_t("Path"),_variant_t(lpszDiskPath));iAds->SetInfo();iAds->Release();iAds->Release();iContainer->Release();iContainer->Release();return TRUE;}else{iAds->Release();iAds->Release();iContainer->Release();iContainer->Release();return FALSE;} }else{iAds->Release();iContainer->Release();}}else{iAds->Release();}iContainer->Release();} return FALSE;}//使用VC需要初始化COM环境,别忘了APP类的InitInstance中AfxOleInit()函数的调用哦。 //**********************但是在运行到if(ADsGetObject(L"IIS://localhost/w3svc",IID_IADsContainer,(void**)&iContainer)==S_OK) 时就出错了,误代码:800401e4 (2000 server) 800401ea (98)大家看看,是怎么回事?strip(阿飞) 谢谢你!我现在没环境,明天试试看 [急切求助]ActiveX绘图,Invalidate刷新问题! mfc问题 关于键盘上下移动的实现???? 对串口接收到数据拆分按要求存储 两个按钮加载不同的的位图问题。 Help:哪位大侠对UNICODE编码技术比较熟悉 两个问题,谢谢! 如何实现在WIN2000下快速关机?100分! mfc做风车用的settimer()函数怎么用啊??? 怎么得到IE的历史记录,就是浏览过的历史网址 类库书上的定义 int CanUndo() const; 这个const什么意思,怎么在后面? 请教大家,实现浏览有三个字段的少量记录用什么控件?datagrid合适吗?不太好看!
建立共享目录函数:Function NetShareAdd(servername:PChar;
level:SmallInt;buf:Pointer;
buf_len:SmallInt):SmallInt;far;stdcall;external 'svrapi.dll';
撤销共享目录函数:Function NetShareDel(servername:PChar;buf:Pointer;
reserved:SmallInt):SmallInt;far;stdcall;external 'svrapi.dll';
这里再提供两个关于连接共享目录/撤销共享目录函数WnetAddConnection和WnetCancelConnection。
关于映射网络驱动器的方法如下:
WNetAddConnection(%共享目录名%,%口令%,'X:'); //映射X盘
WNetCancelConnection('X:',True); //撤销X盘映射
关于建立/撤消共享的函数返回变量说明如下:
const NETNAME_LEN = 13;PASSWORD_LEN = 9;SHI50F_RDONLY = $0001;
SHI50F_FULL = $0002;SHI50F_DEPENDSON = $0003;
SHI50F_ACCESSMASK = $0003;SHI50F_PERSIST = $0100;
SHI50F_SYSTEM = $0200;STYPE_DISKTREE = 0;
STYPE_PRINTQ = 1;STYPE_DEVICE = 2;
STYPE_IPC = 3;NERR_Success = 0;
NERR_BASE = 2100; //常量说明
NERR_UnKnownDevDir=(NERR_BASE+16);NERR_UnknownServer=(NERR_BASE+3);
NERR_ServerNotStarted=(NERR_BASE+14);NERR_RedirectedPath=(NERR_BASE+17); NERR_DuplicateShare=(NERR_BASE+18);NERR_BufTooSmalll=(NERR_BASE+23);
//NetShareAdd返回错误
NERR_NetNotStarted = (NERR_BASE+2);
NERR_ServerNotStarted = (NERR_BASE+14);
NERR_NetNameNotFound = (NERR_BASE+210);
NERR_ShareNotFound = (NERR_BASE+292); //NetShareDel返回错误
SHARE_INFO_50=Record
netname:array [0..NETNAME_LEN-1] of Char;
sharetype:ShortInt;
flags:SmallInt;
re:PChar;
path:PChar;
rw_password:array [0..PASSWORD_LEN-1] of Char;
ro_password:array [0..PASSWORD_LEN-1] of Char;
End; //以上为类型定义
再有就是关于Window9X共享目录口令问题(其实屏保口令也是同样保存的),口令(原始为十六进制字符)
在注册表位置Y_LOCAL_MACHINE\SOFTWARE\micorsoft\windows\current_version\network\lanman\共
享文件夹名\Parm1enc和Parm2enc两位置,Parm1enc为对应的是完全共享密码,Parm2enc对应的是只读共
享密码。字符与数列(前八个数是35,9A,4D,A6,53,A9,D4,6A)作异或运算即得密码的二进制ASCII码,转换
后可得到密码。 另外提供一个比较幼稚但可行的方案(在注册表做动作):
var reg : TRegistry; name : String; //s是在网上邻居里的文件夹名
begin
name := 'DirName';//建立一个只读,无密码共享目录
reg := TRegistry.Create;
reg.RootKey := HKEY_LOCAL_MACHINE;
reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Network\LanMan\'+name,true
);
reg.WriteInteger( 'Flags', 401 ) ; //权限:401代表为访问,258为完全访问,259为密码访问
reg.WriteInteger( 'Parm1enc', 0 ) ; //参数2,放置完全访问密码,已加密
reg.WriteInteger( 'Parm2enc', 0 ) ; //参数2,放置只读访问密码,已加密
reg.WriteString( 'Path', 'C:\MYDIR' ) ; //放置要共享的目录的绝对路径
reg.WriteString( 'Re', '' ) ;
reg.WriteInteger( 'Type', 0 ) ;
end;
这样的缺点就是要重启系统,可以ExitWindowsEx( EWX_FORCE and EWX_SHUTDOWN , 0 )来重启。
此外你还可以使用控件File Sharing
95/98,该控件包含了几个方便的function:ShareResource、DeleteShare、GetShareInfo、
SetShareInfo、GetNetErrorString等。 附:关于NetUserAdd等相关API
WNetCloseEnum 结束网络资源列表
WNetConnectionDialog 开始网络连接对话框
WNetDisconnectDialog 断开网络对话框
WNetEnumResource 继续列表网络资源
WNetGetConnection 获取网络资源名
WNetGetLastError 返回网络函数最近错误
WNetGetUser 获取当前网络用户名
WNetOpenEnum 列出网络资源
http://www.microsoft.com/NTWorkstation/downloads/Other/ADSI25.aspIntel Version (English Language) (http://download.microsoft.com/download/winntwks40/Install/2.5/nt4/en-us/ads.exe)
ADSI 2.5 SDK (English Language) (http://download.microsoft.com/download/winntwks40/sdk/2.5/nt4/en-us/sdk.exe)#include "activeds.h"bool CreateVirtualDirectory( LPWSTR wszWebDir, LPWSTR wszVirDirName, LPWSTR wszVirDirPath )
{
bool bReturn = false;
IADs *pParentADs=NULL;
HRESULT hr = ADsGetObject( wszWebDir ,IID_IADs,(void**)&pParentADs);
if( hr == S_OK )
{
IADsContainer *container;
if( pParentADs->QueryInterface(IID_IADsContainer,(void**)&container) == S_OK )
{
IDispatch *object=NULL;
IADs *pChildADs=NULL;
hr = container->Create( L"IIsWebVirtualDir", wszVirDirName, &object);
if(hr == S_OK)
{
hr = object->QueryInterface(IID_IADs,(void**)&pChildADs);
object->Release();
VARIANT var;
VariantInit(&var);
V_BSTR(&var) = SysAllocString( wszVirDirPath );
V_VT(&var) = VT_BSTR;
hr=pChildADs->Put( L"path", var );
VariantClear(&var);
V_BSTR(&var) = SysAllocString( wszVirDirName );
V_VT(&var) = VT_BSTR;
hr=pChildADs->Put( L"AppFriendlyName", var );
VariantClear(&var);
hr=pChildADs->SetInfo();
hr=pChildADs->Release();
bReturn = true;
}
container->Release();
}
pParentADs->Release();
}
return bReturn;
}bool RemoveVirtualDirectory( LPWSTR wszWebDir, LPWSTR wszVirDirName )
{
bool bReturn = false;
IADs *pParentADs=NULL;
HRESULT hr = ADsGetObject( wszWebDir ,IID_IADs,(void**)&pParentADs);
if( hr == S_OK )
{
IADsContainer *container;
if( pParentADs->QueryInterface(IID_IADsContainer,(void**)&container) == S_OK )
{
IDispatch *object=NULL;
IADs *pChildADs=NULL;
hr = container->Delete( L"IIsWebVirtualDir", wszVirDirName );
if(hr == S_OK)
{
bReturn = true;
}
container->Release();
}
pParentADs->Release();
}
return bReturn;
}int main(int argc, char* argv[])
{
CoInitialize(NULL);
bool b;
b = CreateVirtualDirectory( L"IIS://LOCALHOST/W3SVC/1/Root", L"test", L"f:\\temp1" );
printf("\n%d", b);
b = RemoveVirtualDirectory( L"IIS://LOCALHOST/W3SVC/1/Root", L"test" );
printf("\n%d", b);
CoUninitialize();
return 0;
}
我的目的是在:“默认的web站点” 下添加 一虚拟目录
我这儿一段源程序://******************************
在Visual C++中使用ADSI,需要#include activeds.h,连接activeds.lib和adsiid.lib库文件,并要使用Unicode字符串。
这个例子是使用VC在默认Web站点建立的虚拟目录。///////////////////////////////////////////////
// CreateVirtualDirection参数说明
// lpszVirtualDirName需要建立的虚拟目录的目录名字
// lpszDiskPath 需要建立虚拟目录的本地磁盘目录
//////////////////////////////////////////////BOOL CreateVirtualDirection(LPCTSTR lpszVirtualDirName,LPCTSTR lpszDiskPath)
{
IADsContainer* iContainer;
IADs* iAds;
/* 获得WebSever */
if(ADsGetObject(L"IIS://localhost/w3svc",IID_IADsContainer,(void**)&iContainer)==S_OK)
{
//等到默认站点
iContainer->GetObject(_bstr_t("IIsWebServer"), _bstr_t("1"),(IDispatch**)&iAds);
if(iAds->QueryInterface(IID_IADsContainer,(void**)&iContainer)==S_OK)
{
//得到默认站点的根目录
iContainer->GetObject(_bstr_t("IIsWebVirtualDir"),_bstr_t("Root"),(IDispatch**)&iAds);
//获得访问虚拟目录
if(iAds->QueryInterface(IID_IADsContainer,(void**)&iContainer)==S_OK)
{
//先删除了虚拟目录
iContainer->Delete(_bstr_t("IIsWebVirtualDir"), _bstr_t(lpszVirtualDirName));
//建立虚拟目录
if(iContainer->Create(_bstr_t("IIsWebVirtualDir"), _bstr_t(lpszVirtualDirName),(IDispatch**)&iAds)==S_OK)
{
//设置虚拟目录的属性
iAds->Put(_bstr_t("AccessRead"),_variant_t("True"));//注意跟VB中的设置属性比较
iAds->Put(_bstr_t("AccessWrite"),_variant_t("True"));
iAds->Put(_bstr_t("Path"),_variant_t(lpszDiskPath));
iAds->SetInfo();
iAds->Release();
iAds->Release();
iContainer->Release();
iContainer->Release();
return TRUE;
}
else
{
iAds->Release();
iAds->Release();
iContainer->Release();
iContainer->Release();
return FALSE;
}
}
else
{
iAds->Release();
iContainer->Release();
}
}
else
{
iAds->Release();
}
iContainer->Release();
}
return FALSE;
}
//使用VC需要初始化COM环境,别忘了APP类的InitInstance中AfxOleInit()函数的调用哦。
//**********************但是在运行到
if(ADsGetObject(L"IIS://localhost/w3svc",IID_IADsContainer,(void**)&iContainer)==S_OK)
时就出错了,误代码:800401e4 (2000 server)
800401ea (98)
大家看看,是怎么回事?strip(阿飞) 谢谢你!我现在没环境,明天试试看