Access911.net   |   a9BBS   |   OTaA System  
  搜索文章:  
Access911欢迎您光临  
   主页      上传      繁體版       论坛     
设为首页  |  加入收藏   
  
你现在的位置:文章索引 -> 文章分类 -> 发布  
 首页|  近日更新|  下载  |  文章索引  |  搜索|  术语|  承接工程|  
 
系统正在加载内容,请耐心等待...
 
 查询
 窗体
 报表
 
 
 VBA
 函数
 ADO/DAO/ADO.NET
 API
 ADP
 安全
 发布
 OA
 ASP/ASP.NET
 其他语言
 控件
 DELPHI
 C#/.Net
 本站
 其他
 小例程
 常用软件
 参考文档
 业主作品
 网友大作
 
 
友情链接
 access911.net
 
访问人次
 1702018
 
站长 E-Mail
 net911@sina.com
 access911@gmail.com
 
RSS 订阅

显示附加信息 >>>

如何解决共享目录加访问密码后导致链接表出错问题?

作者:cg1  摘自:access911.net  :cg1  更新日期:2006-3-14  浏览人次:

 

问题:

拆分数据库后,服务器共享目录加了访问密码,但是导致链接表出错,一定要手动访问一下服务器,然后再输入用户名和密码才能访问,这该如何解决?

 

方法一:


如果你的数据库是采取文件共享方式放在服务器的某个目录中,编程链接表时可以用 \\server\xxx.mdb 的方式来打开。但是如果这个目录设置了访问密码,那么就无法打开了。因为这是 WINDOWS 的安全限制,如果你的服务器没有加入域,解决方法是:
一、你可以在服务器的 WINDOWS 上创建一个和客户机当前操作用户名和登录密码完全一致的用户。
二、在用链接表访问前手动打开一下那个共享目录
三、编程解决,用 WMI / WIN32 API / SHELL 先访问一下该目录,然后再链接该表即可
这里举例用最简单的 SHELL 完成:
shell "cmd.exe/c ""net use \\" & ServerName + "\" & ShareName & " " & Password & " /user:" & UserName & """" 

 

方法二:


Const WN_Success = &H0
Const WN_Not_Supported = &H1
Const WN_Net_Error = &H2
Const WN_Bad_Pointer = &H4
Const WN_Bad_NetName = &H32
Const WN_Bad_Password = &H6
Const WN_Bad_Localname = &H33
Const WN_Access_Denied = &H7
Const WN_Out_Of_Memory = &HB
Const WN_Already_Connected = &H34
Public ErrorNum     As Long
Public ErrorMsg     As String
Public rc As Long
Private Const ERROR_NO_CONNECTION = 8
Private Const ERROR_NO_DISCONNECT = 9
Private Type NETRESOURCE
    dwScope As Long
    dwType As Long
    dwDisplayType As Long
    dwUsage As Long
    lpLocalName As String
    lpRemoteName As String
    lpComment As String
    lpProvider As String
End Type
Private Declare Function WNetAddConnection2 Lib "mpr.dll" _
    Alias "WNetAddConnection2A" (lpNetResource As NETRESOURCE, _
    ByVal lpPassword As String, ByVal lpUserName As String, _
    ByVal dwFlags As Long) As Long
Const NO_ERROR = 0
Const CONNECT_UPDATE_PROFILE = &H1
Const RESOURCETYPE_DISK = &H1
Const RESOURCETYPE_PRINT = &H2
Const RESOURCETYPE_ANY = &H0
Const RESOURCE_GLOBALNET = &H2
Const RESOURCEDISPLAYTYPE_SHARE = &H3
Const RESOURCEUSAGE_CONNECTABLE = &H1
Public Declare Function WNetCancelConnection2 Lib "mpr.dll" Alias "WNetCancelConnection2A" (ByVal lpName As String, ByVal dwFlags As Long, ByVal fForce As Long) As Long
Private Declare Function WNetDisconnectDialog Lib "mpr.dll" (ByVal hWnd As Long, ByVal dwType As Long) As Long

Public Const ERROR_DEVICE_IN_USE = 2404&
Public Const ERROR_NOT_CONNECTED = 2250&
Public Const ERROR_OPEN_FILES = 2401&


Public Const ERROR_ACCESS_DENIED = 5&
Public Const ERROR_ALREADY_ASSIGNED = 85&
Public Const ERROR_BAD_DEV_TYPE = 66&
Public Const ERROR_BAD_DEVICE = 1200&
Public Const ERROR_BAD_NET_NAME = 67&
Public Const ERROR_BAD_PROFILE = 1206&
Public Const ERROR_BAD_PROVIDER = 1204&
Public Const ERROR_BUSY = 170&
Public Const ERROR_CANNOT_OPEN_PROFILE = 1205&
Public Const ERROR_DEVICE_ALREADY_REMEMBERED = 1202&
Public Const ERROR_EXTENDED_ERROR = 1208&
Public Const ERROR_INVALID_PASSWORD = 86&
Public Const ERROR_NO_NET_OR_BAD_PATH = 1203&           '服务器不存在或者无法访问
Public Const ERROR_NO_NETWORK = 1222&
Public Const ERROR_SESSION_CREDENTIAL_CONFLICT = 1219&  '凭据冲突,与前一次的用户名密码输入不符。可能要先断开一下再连接
Public Const ERROR_LOGON_FAILURE = 1326&                '登录失败,用户名密码不对

Public Function DisconnectNetworkDialog() As Long
'弹出对话框让用户选择断开哪个链接
    DisconnectNetworkDialog = WNetDisconnectDialog(0&, RESOURCETYPE_DISK)
    
End Function
Function RunTest()
    'Debug.Print ConnectUserPassword("\\i7cgwin7\users", "", "i7cgwin7\cg1", "123456")
    '在windows7上访问windows2003上的共享目录总是返回:1219错误,很奇怪。

    Debug.Print ConnectUserPassword("\\192.168.2.105\新建文件夹 (4)", "", "192.168.2.105\administrator", "123456")

End Function
Public Function runtest2()
    '最后一个参数为True表示无条件断开,即使有文件正在使用也断开
    Debug.Print WNetCancelConnection2("\\i7cgwin7", CONNECT_UPDATE_PROFILE, True)
    
    Debug.Print WNetCancelConnection2("\\i7cgwin7\users", CONNECT_UPDATE_PROFILE, True)

End Function

Public Function ConnectUserPassword(sDrive As String, sService As String, Optional sUser As String = "", Optional sPassword As String = "") As Boolean
    Dim NETR As NETRESOURCE
    Dim errInfo As Long
    With NETR
        .dwScope = RESOURCE_GLOBALNET
        .dwType = RESOURCETYPE_DISK
        .dwDisplayType = RESOURCEDISPLAYTYPE_SHARE
        .dwUsage = RESOURCEUSAGE_CONNECTABLE
        .lpRemoteName = sDrive
        .lpLocalName = sService
    End With
    errInfo = WNetAddConnection2(NETR, sPassword, sUser, CONNECT_UPDATE_PROFILE)
    '说明
    '创建同一个网络资源的连接
    '返回值
    'Long,零表示成功。会设置GetLastError。如GetLastError是ERROR_EXTENDED_ERROR,则可用WNetGetLastError取得额外的错误信息
    '参数表
    '参数 类型及说明
    'lpNetResource NETRESOURCE,在这个结构中设置了下述字段,对要连接的网络资源进行了定义:dwType, lpLocalName (可为 vbNullString), lpRemoteName, lpProvider (设为 vbNullString 表示用默认提供者)。该结构的其他所有变量都会被忽略
    'lpPassword String,可选的一个密码。如为vbNullString,表示采用当前用户的默认密码。如为一个空字串,则不用任何密码
    'lpUserName String,用于连接的用户名。如为vbNullString,表示使用当前用户
    'dwFlags Long,设为零;或指定常数CONNECT_UPDATE_PROFILE,表示创建永久性连接

    ConnectUserPassword = errInfo = NO_ERROR
    Debug.Print errInfo
End Function


 


方法三:

以下为文章摘录,有空时 ACCESS911 将整理成完整的示例

http://topic.csdn.net/t/20031108/16/2440801.html

求:访问共享文件夹的方法(9x++ & NT++)UP有分
a11s (全面进入.Net DirectX研究中...)     2003-11-08 16:21:03 在 VB / 网络编程 提问
预防针1:不要给我说用Net   Use   或者   Net   Share
预防针2:要的不是共享方法,是访问方法
主体:
感谢大家的相助,总算知道了如何共享文件夹,但是我不会访问
举一个例子:我已经共享了sharename=   \\10.0.0.1\sharedir   这个文件夹
我怎样才能   1、列出sharedir的内容(像windows一样,他好像没有影射驱动器)
                            (包括子文件夹,windoz连属性都能看)
                      2、复制sharedir下的文件到本地
                      3、怎样才能实现像windows那样的进度控制
我已经搜索过CSDN99年以后的帖子,没有找到满意答案。劳烦诸位N星了。
小生在此谢过。
E-Mail:dsonic@sohu.com     dsonic@msn.com   (最好两个都发,不要忘记写下您在CSDN上的昵称)
QQ:51496532     用户验证消息:   CSDN 

问题点数:200、回复次数:28 

1楼  a11s   (全面进入.Net DirectX研究中...)   回复于 2003-11-08 16:27:49  得分 0 
SP1:如果9x和2k不一样,那么两种都要。
        发送邮件时主题最好是"Come   From   CSDN",以免被我勿删 

Top
2楼  a11s   (全面进入.Net DirectX研究中...)   回复于 2003-11-08 19:05:39  得分 0 
先自己顶一下
我的问题很垃圾么,3个小时了,连一个关注的都没有 

Top
3楼  rainstormmaster   (暴风雨 v2.0)   回复于 2003-11-08 19:13:33  得分 0 
mark 

Top
4楼  rainstormmaster   (暴风雨 v2.0)   回复于 2003-11-08 20:00:26  得分 0 
用FSO对象,和访问本地文件没有什么区别
//1列出sharedir的内容:
首先引用Microsoft   Scripting   Runtime
窗体上一个treeview,一个listbox:
Option   Explicit
Dim   FSO   As   New   FileSystemObject
Private   Sub   Form_Load()
        Dim   mfolder   As   Folder
        Set   mfolder   =   FSO.GetFolder("\\192.168.2.1\guo")
        Dim   mnode   As   Node
        Set   mnode   =   Me.TreeView1.Nodes.Add(,   ,   mfolder.Path,   mfolder.Path)
        Dim   a   As   File
        For   Each   a   In   mfolder.Files
                Me.List1.AddItem   a.Name
        Next
        Dim   subfolder   As   Folder
        For   Each   subfolder   In   mfolder.SubFolders
                Me.TreeView1.Nodes.Add   mnode,   tvwChild,   subfolder.Path,   subfolder.Name
        Next
        Set   subfolder   =   Nothing
        Set   a   =   Nothing
        Set   mfolder   =   Nothing
End   Sub

Private   Sub   Form_Unload(Cancel   As   Integer)
Set   FSO   =   Nothing
End   Sub

Private   Sub   TreeView1_NodeClick(ByVal   Node   As   MSComctlLib.Node)
        On   Error   Resume   Next
        Dim   mfolder   As   Folder
        Set   mfolder   =   FSO.GetFolder(Node.Key)
        Dim   a   As   File
        List1.Clear
        For   Each   a   In   mfolder.Files
                Me.List1.AddItem   a.Name
        Next
        Dim   subfolder   As   Folder
        For   Each   subfolder   In   mfolder.SubFolders
                Me.TreeView1.Nodes.Add   Node,   tvwChild,   subfolder.Path,   subfolder.Name
        Next
        Set   subfolder   =   Nothing
        Set   a   =   Nothing
        Set   mfolder   =   Nothing
End   Sub


Top
5楼  rainstormmaster   (暴风雨 v2.0)   回复于 2003-11-08 20:24:41  得分 0 
//2、复制sharedir下的文件到本地
//3、怎样才能实现像windows那样的进度控制

窗体上一个按钮,一个ProgressBar:Option   Explicit
'\\192.168.2.1\guo\123.rar
Public   Function   CopyFile(Src   As   String,   Dst   As   String,   mProgressBar   As   ProgressBar)   As   Single
          
          Dim   BTest   As   Single,   FSize   As   Single
          Dim   F1   As   Integer,   F2   As   Integer
          Dim   sArray()   As   Byte
          Dim   buff   As   Integer
          
          Const   BUFSIZE   =   1024
          
          buff   =   1024
          
          F1   =   FreeFile
          Open   Src   For   Binary   Access   Read   As   F1
          F2   =   FreeFile
          Open   Dst   For   Binary   As   F2
          
          FSize   =   LOF(F1)
          BTest   =   FSize   -   LOF(F2)
          ReDim   sArray(BUFSIZE)   As   Byte
          
          Do
          If   BTest   <   BUFSIZE   Then
          buff   =   BTest
          ReDim   sArray(buff)   As   Byte
          End   If
          
          Get   F1,   ,   sArray
          Put   F2,   ,   sArray
          
          BTest   =   FSize   -   LOF(F2)
          If   BTest   <   0   Then
          mProgressBar.Value   =   100
          Else
          mProgressBar.Value   =   (100   -   Int(100   *   BTest   /   FSize))
          End   If
          Loop   Until   BTest   <=   0
          
          Close   F1
          Close   F2
          CopyFile   =   FSize
          
        End   Function

Private   Sub   Command1_Click()
'复制文件   d:\ms\room.exe   到   d:\room1.exe
CopyFile   "\\192.168.2.1\guo\123.rar",   "d:\myroom2.exe",   ProgressBar1
End   Sub


需要指出的是以上代码成功运行的前提是共享文件夹的访问类型为“完全”,如果你的共享文件夹的访问类型为“只读”,你需要在程序运行时,改变它的访问类型为为“完全”。既然你已经知道了:
如何共享文件夹,这里我就不罗嗦了

其实,访问一个访问类型为“完全”的共享文件夹,和访问本地文件没有什么不同


Top
6楼  a11s   (全面进入.Net DirectX研究中...)   回复于 2003-11-08 20:43:54  得分 0 
感动ing,不过今天晚上没有时间式了,明天再说 

Top
7楼  a11s   (全面进入.Net DirectX研究中...)   回复于 2003-11-08 22:05:12  得分 0 
非常感谢   rainstormmaster(rainstormmaster)   
确实实现了我所要的功能,我从来没有想到过FSO有这种功能
以及Open语句支持网络路径!这个连MSDN都没说。由此可见   rainstormmaster
的确是高手中的高高手!

但是经过我的测试,并不像您说的
“其实,访问一个访问类型为“完全”的共享文件夹,和访问本地文件没有什么不同
”但是似乎只有OPEN、kill、rmdir、mkdir才一样,其他API我还没有尝试。
(原来在win2k下copy、dir都支持网络   dir   \\10.0.0.1\temp\*.*)
再就是服务器的共享不可能没有密码的。如果设置完全权限,太不安全。

Win98的共享不是用FSO的,因为我同学的机器从来不安装FSO(因为不安全),但是照样可以用网络邻居共享。

其他的网络邻居工具软件比如IPBOOK   局域网超级工具   ==   好像也不是用的FSO,并且支持密码

据我所知,win2k之间的共享速度很快,而98对98   或者   2k对98   就很慢,应该有相关的API吧
要不然为什么都这样。
===================================================
应该有更完美的解决办法是我们所不知道的。
可以解决   共享密码的问题
尽量不要使用windows可选安装的项目

再次感谢   rainstormmaster

期待更完美的解决办法


Top
8楼  rainstormmaster   (暴风雨 v2.0)   回复于 2003-11-09 10:02:01  得分 0 
呵呵,我是说的不够严谨,其实我所指的只是OPEN、kill。

关于共享的权限和密码问题,可以通过api搞定,参考:
http://expert.csdn.net/Expert/topic/2383/2383823.xml?temp=.4354364
http://expert.csdn.net/Expert/topic/2437/2437228.xml?temp=.1366693
http://expert.csdn.net/Expert/topic/2371/2371234.xml?temp=.311352
http://expert.csdn.net/Expert/topic/2371/2371069.xml?temp=.9437525 

Top
9楼  a11s   (全面进入.Net DirectX研究中...)   回复于 2003-11-09 10:20:27  得分 0 
首先感谢rainstormmaster的大力支持!
第一个连接有一个跳转,转到用VBS如何批量设置权限(不是访问)
第二、三个连接是如何使用NetShareAdd、NetShareDel   Lib   "netapi32.dll"   设置权限(不是访问)
最后一个连接是如何使用Net   Share

似乎都不能解决远程登陆时的用户名密码问题


Top
10楼  rainstormmaster   (暴风雨 v2.0)   回复于 2003-11-09 10:24:39  得分 0 
我是要你设置“完全”权限后,进行访问 

Top
11楼  a11s   (全面进入.Net DirectX研究中...)   回复于 2003-11-09 10:26:33  得分 0 
这是我引用别人的模块,(对不起,原作者的名字不是我删的,bas拿来时已经没有了)。
请大家不要再怀疑设置共享方面还有问题,主要是如何才能访问带密码的共享
Option   Explicit

'2000   下用API来实现目录共享及删除共享

'共享类型
Private   Const   STYPE_ALL               As   Long   =   -1
Private   Const   STYPE_DISKTREE     As   Long   =   0
Private   Const   STYPE_PRINTQ         As   Long   =   1
Private   Const   STYPE_DEVICE         As   Long   =   2
Private   Const   STYPE_IPC               As   Long   =   3
Private   Const   STYPE_SPECIAL       As   Long   =   &H80000000

'权限
Private   Const   ACCESS_READ           As   Long   =   &H1
Private   Const   ACCESS_WRITE         As   Long   =   &H2
Private   Const   ACCESS_CREATE       As   Long   =   &H4
Private   Const   ACCESS_EXEC           As   Long   =   &H8
Private   Const   ACCESS_DELETE       As   Long   =   &H10
Private   Const   ACCESS_ATRIB         As   Long   =   &H20
Private   Const   ACCESS_PERM           As   Long   =   &H40
Private   Const   ACCESS_ALL             As   Long   =   ACCESS_READ   Or   _
                                                                                ACCESS_WRITE   Or   _
                                                                                ACCESS_CREATE   Or   _
                                                                                ACCESS_EXEC   Or   _
                                                                                ACCESS_DELETE   Or   _
                                                                                ACCESS_ATRIB   Or   _
                                                                                ACCESS_PERM

'共享信息
Private   Type   SHARE_INFO_2
    shi2_netname               As   Long                 '共享名
    shi2_type                     As   Long                 '类型
    shi2_remark                 As   Long                 '备注
    shi2_permissions       As   Long                 '权限
    shi2_max_uses             As   Long                 '最大用户
    shi2_current_uses     As   Long                 '
    shi2_path                     As   Long                 '路径
    shi2_passwd                 As   Long                 '密码
End   Type
    
'设置共享
Private   Declare   Function   NetShareAdd   Lib   "netapi32"   _
                                                      (ByVal   ServerName   As   Long,   _
                                                        ByVal   level   As   Long,   _
                                                        buf   As   Any,   _
                                                        parmerr   As   Long)   As   Long

'删除共享
Private   Declare   Function   NetShareDel   Lib   "netapi32.dll"   _
                                                      (ByVal   ServerName   As   Long,   _
                                                        ByVal   ShareName   As   Long,   _
                                                        ByVal   dword   As   Long)   As   Long
                                          

'设置共享(返回0   为成功)
'参数:
'sServer                     计算机名
'sSharePath               要共享路径
'sShareName               显示的共享名
'sShareRemark           备注
'sSharePw                   密码
Private   Function   ShareAdd(sServer   As   String,   _
                                                    sSharePath   As   String,   _
                                                    sShareName   As   String,   _
                                                    sShareRemark   As   String,   _
                                                    sSharePw   As   String)   As   Long
      
      Dim   lngServer       As   Long
      Dim   lngNetname     As   Long
      Dim   lngPath           As   Long
      Dim   lngRemark       As   Long
      Dim   lngPw               As   Long
      Dim   parmerr         As   Long
      Dim   si2                 As   SHARE_INFO_2
      
      lngServer   =   StrPtr(sServer)             '转成地址
      lngNetname   =   StrPtr(sShareName)
      lngPath   =   StrPtr(sSharePath)
      
      '如果有备注信息
      If   Len(sShareRemark)   >   0   Then
            lngRemark   =   StrPtr(sShareRemark)
      End   If
      
      '如果有密码
      If   Len(sSharePw)   >   0   Then
            lngPw   =   StrPtr(sSharePw)
      End   If
            
    '初始化共享信息
      With   si2
            .shi2_netname   =   lngNetname
            .shi2_path   =   lngPath
            .shi2_remark   =   lngRemark
            .shi2_type   =   STYPE_DISKTREE
            .shi2_permissions   =   ACCESS_ALL
            .shi2_max_uses   =   -1
            .shi2_passwd   =   lngPw
      End   With
                                                    
    '设置共享(用户名,共享类型,共享信息,)
      ShareAdd   =   NetShareAdd(lngServer,   _
                                                    2,   _
                                                    si2,   _
                                                    parmerr)
                                                    
End   Function

'删除共享(返回0   为成功)
'参数:
'sServer               计算机名
'sShareName         共享名
Private   Function   DelShare(sServer   As   String,   _
                                                    sShareName   As   String)   As   Long
      
      Dim   lngServer       As   Long               '计算机名
      Dim   lngNetname     As   Long               '共享名

      lngServer   =   StrPtr(sServer)             '转成地址
      lngNetname   =   StrPtr(sShareName)

      '删除共享
      DelShare   =   NetShareDel(lngServer,   lngNetname,   0)

End   Function
(感谢源代码提供者)


Top
12楼  a11s   (全面进入.Net DirectX研究中...)   回复于 2003-11-09 10:29:00  得分 0 
To   rainstormmaster
您的意思我明白,让我重新设置服务器的管理权限。
但是管理员绝对不会允许我这么做的。 

Top
13楼  zqfleaf   (动力港湾)   回复于 2003-11-09 11:04:10  得分 0 
用net   use   可以,只是你不想用shell命令是不是?
net   use   是可以在windows中建立一个联接(你可以用net   use可以看到所有的联接)
你现在是不是不想用net   use   而用api来代替?
================
把下面代码放到module中
Option   Explicit
        Const   WN_Success   =   &H0
        Const   WN_Not_Supported   =   &H1
        Const   WN_Net_Error   =   &H2
        Const   WN_Bad_Pointer   =   &H4
        Const   WN_Bad_NetName   =   &H32
        Const   WN_Bad_Password   =   &H6
        Const   WN_Bad_Localname   =   &H33
        Const   WN_Access_Denied   =   &H7
        Const   WN_Out_Of_Memory   =   &HB
        Const   WN_Already_Connected   =   &H34
        Public   ErrorNum   As   Long
        Public   ErrorMsg   As   String
        Public   rc   As   Long
        Private   Const   ERROR_NO_CONNECTION   =   8
        Private   Const   ERROR_NO_DISCONNECT   =   9
        Private   Type   NETRESOURCE
        dwScope   As   Long
        dwType   As   Long
        dwDisplayType   As   Long
        dwUsage   As   Long
        lpLocalName   As   String
        lpRemoteName   As   String
        lpComment   As   String
        lpProvider   As   String
        End   Type
        Private   Declare   Function   WNetAddConnection2   Lib   "mpr.dll"   Alias   "WNetAddConnection2A"   (lpNetResource   As   NETRESOURCE,   ByVal   lpPassword   As   String,   ByVal   lpUserName   As   String,   ByVal   dwFlags   As   Long)   As   Long
        Const   NO_ERROR   =   0
        Const   CONNECT_UPDATE_PROFILE   =   &H1
        Const   RESOURCETYPE_DISK   =   &H1
        Const   RESOURCETYPE_PRINT   =   &H2
        Const   RESOURCETYPE_ANY   =   &H0
        Const   RESOURCE_GLOBALNET   =   &H2
        Const   RESOURCEDISPLAYTYPE_SHARE   =   &H3
        Const   RESOURCEUSAGE_CONNECTABLE   =   &H1

        Public   Function   ConnectUserPassword(sDrive   As   String,   sService   As   String,   Optional   sUser   As   String   =   "",   Optional   sPassword   As   String   =   "")   As   Boolean
        Dim   NETR   As   NETRESOURCE
        Dim   errInfo   As   Long
        With   NETR
        .dwScope   =   RESOURCE_GLOBALNET
        .dwType   =   RESOURCETYPE_DISK
        .dwDisplayType   =   RESOURCEDISPLAYTYPE_SHARE
        .dwUsage   =   RESOURCEUSAGE_CONNECTABLE
        .lpRemoteName   =   sDrive
        .lpLocalName   =   sService
        End   With
        errInfo   =   WNetAddConnection2(NETR,   sPassword,   sUser,   CONNECT_UPDATE_PROFILE)
        ConnectUserPassword   =   errInfo   =   NO_ERROR
        End   Function


================
call   ConnectUserPassword("\\servername",   "",   "password",   "username")

相当于     net   use   \\servername     password   /user:username
不知道是否可以?返回值代表成功或失败 

Top
14楼  a11s   (全面进入.Net DirectX研究中...)   回复于 2003-11-09 11:31:53  得分 0 
谢谢zqfleaf(动力港湾)
一般我使用Net   Use   影射网络驱动器,至于这种不需要盘符的Net   use   没有用过
=========20分钟之后============
明白了,   使用net   use   \\10.0.0.3\movie   password   /user:username
之后Windows会“记住”刚才输入的密码,以再次访问时不会提示输入密码
这样可以实现针对密码的访问
========之所以不想用Net   Use的原因=========
因为win9x   的Net命令功能不全,不像win2000
而且针对DOS命令(姑且让我这么叫吧)要求高,万一Net改名就没法用了

再次感谢     zqfleaf(动力港湾)


Top
15楼  a11s   (全面进入.Net DirectX研究中...)   回复于 2003-11-09 11:41:17  得分 0 
问题基本上解决了。还有一点点的遗憾
可不可以不用FSO,对于引用来说不一定每个操作系统都有
而且不是每个人都喜欢FSO的(当然咱们例外,毕竟方便嘛)
对于win98来说,这项功能在个人用户面前几乎没用,而且容易感染蠕虫
所以有很多文章建议卸载这个组件。这样我的程序在通用性上就不是那么很好了。

可不可以不用FSO。应该有其他的办法吧。
(sorry   rainstormmaster不是对您有意见,您的办法很好,我只是想知道有没有更完美的解决办法而已)

===========================
如果这个问题解决了,那么这个帖子可以组成局域网共享的完美解决方案了。
建议斑竹加入精华贴 

Top
16楼  rainstormmaster   (暴风雨 v2.0)   回复于 2003-11-09 12:50:43  得分 0 
//问题基本上解决了
且慢,在98下试过了吗,在98下更改共享文件夹的密码和访问类型,用zqfleaf(动力港湾)的代码可是不行的   :)

//可不可以不用FSO。应该有其他的办法吧
当然可以了,等会我写点代码贴上来

Top
17楼  rainstormmaster   (暴风雨 v2.0)   回复于 2003-11-09 13:21:10  得分 95 
在98下建立访问类型为完全的访问密码为“”的共享文件夹
Option   Explicit

Private   Const   NERR_SUCCESS   As   Long   =   0&

'   Share   types
Private   Const   STYPE_ALL               As   Long   =   -1     'note:   my   const
Private   Const   STYPE_DISKTREE     As   Long   =   0
Private   Const   STYPE_PRINTQ         As   Long   =   1
Private   Const   STYPE_DEVICE         As   Long   =   2
Private   Const   STYPE_IPC               As   Long   =   3
Private   Const   STYPE_SPECIAL       As   Long   =   &H80000000

'   Flags
Private   Const   SHI50F_RDONLY   =   &H1
Private   Const   SHI50F_FULL   =   &H2
Private   Const   SHI50F_DEPENDSON   =   SHI50F_RDONLY   +   SHI50F_FULL
Private   Const   SHI50F_ACCESSMASK   =   SHI50F_RDONLY   +   SHI50F_FULL
Private   Const   SHI50F_PERSIST   =   &H100   '   Partage   persistant
Private   Const   SHI50F_SYSTEM   =   &H200   '   Partage   cach?

'   Permissions   (Win   ME/NT/2000/XP)
Private   Const   ACCESS_READ           As   Long   =   &H1
Private   Const   ACCESS_WRITE         As   Long   =   &H2
Private   Const   ACCESS_CREATE       As   Long   =   &H4
Private   Const   ACCESS_EXEC           As   Long   =   &H8
Private   Const   ACCESS_DELETE       As   Long   =   &H10
Private   Const   ACCESS_ATRIB         As   Long   =   &H20
Private   Const   ACCESS_PERM           As   Long   =   &H40
Private   Const   ACCESS_ALL             As   Long   =   ACCESS_READ   Or   ACCESS_WRITE   Or   ACCESS_CREATE   Or   ACCESS_EXEC   Or   ACCESS_DELETE   Or   ACCESS_ATRIB   Or   ACCESS_PERM

'   Win   9x
Private   Type   SHARE_INFO_50
        shi50_netname(0   To   12)   As   Byte   'LM20_NNLEN   +   1
        shi50_type   As   Byte   'EShareType
        shi50_flags   As   Integer
        shi50_remark   As   Long
        shi50_Path   As   Long
        shi50_rw_password(0   To   8)   As   Byte   'SHPWLEN   +   1
        shi50_ro_password(0   To   8)   As   Byte   'SHPWLEN   +   1
End   Type

'   Quelle   systeme   d'exploitation
Private   Type   OSVERSIONINFO
        dwOSVersionInfoSize   As   Long
        dwMajorVersion   As   Long
        dwMinorVersion   As   Long
        dwBuildNumber   As   Long
        dwPlatformId   As   Long
        szCSDVersion   As   String   *   128
End   Type

Private   Declare   Function   NetShareAdd95   Lib   "SVRAPI"   Alias   "NetShareAdd"   (ByVal   servername   As   String,   ByVal   level   As   Integer,   ByVal   buf   As   Long,   ByVal   cbBuffer   As   Integer)   As   Long
Private   Declare   Sub   CopyMemory   Lib   "kernel32"   Alias   "RtlMoveMemory"   (lpvDest   As   Any,   lpvSource   As   Any,   ByVal   cbCopy   As   Long)

Private   Sub   cmdCreateShare_Click()
        
        Dim   lngSuccess   As   Long
        
        '   Create   the   share

          '要添加上相应的textbox
        lngSuccess   =   ShareAdd(UCase(txtComputerName.Text),   UCase(txtLocalPath.Text),   UCase(txtShareName.Text),   txtShareDesc.Text)
        'lngSuccess   =   ShareAdd(txtComputerName.Text,   txtLocalPath.Text,   txtShareName.Text,   txtShareDesc.Text,   txtSharePassRo.Text,   txtSharePassRw.Text)
        
        Select   Case   lngSuccess
              Case   0:         '   Share   created   successfully
              Case   2118'共享名已经存在,就改改共享名,我这随便补了一个1
              lngSuccess   =   ShareAdd(UCase(txtComputerName.Text),   UCase(txtLocalPath.Text),   UCase(txtShareName.Text)   +   "1",   txtShareDesc.Text)
              Case   Else:   MsgBox   "Create   error   number   "   &   lngSuccess,   vbCritical,   "Error"
        End   Select

End   Sub

Private   Function   ShareAdd(sServer   As   String,   sSharePath   As   String,   sShareName   As   String,   sShareRemark   As   String)   As   Long

        Dim   si50   As   SHARE_INFO_50
        Dim   iErrParam   As   Integer
        Dim   lpszPath()   As   Byte
        Dim   lpszRemark()   As   Byte
        Dim   intFlags   As   Integer

intFlags   =   SHI50F_FULL   Or   SHI50F_PERSIST   'mode   normal   le   partage   est   visible   sur   la   machine
'   flags   =   SHI50F_FULL   Or   SHI50F_PERSIST   Or   SHI50F_SYSTEM   'mode   syst鑝e   partage   invisible
lpszPath   =   StrConv(sSharePath,   vbFromUnicode)   &   vbNullChar
lpszRemark   =   StrConv(sShareRemark,   vbFromUnicode)   &   vbNullChar

With   si50
        StrToByte   sShareName,   VarPtr(.shi50_netname(0))
        .shi50_type   =   STYPE_DISKTREE
        .shi50_remark   =   VarPtr(lpszRemark(0))
        .shi50_Path   =   VarPtr(lpszPath(0))
        StrToByte   "",   VarPtr(.shi50_ro_password(0))
        StrToByte   "",   VarPtr(.shi50_rw_password(0))
        .shi50_flags   =   intFlags
End   With

ShareAdd   =   NetShareAdd95("",   50,   ByVal   VarPtr(si50),   LenB(si50))
        
End   Function

Private   Sub   StrToByte(strInput   As   String,   ByVal   lpByteArray   As   Long)
        Dim   lpszInput()   As   Byte
        lpszInput   =   StrConv(strInput,   vbFromUnicode)   &   vbNullChar
        CopyMemory   ByVal   lpByteArray,   lpszInput(0),   UBound(lpszInput)
End   Sub

Top
18楼  xiaohuangtao   (绿毛网虫)   回复于 2003-11-09 14:24:00  得分 5 
最奸单的办法把:
将该文件夹加到FTP服务中啊,用Ftp访问嘛,哪里有这么复杂啊。
功能实现就OK!
我的软件下载地址:http://www.cnkernel.com/


Top
19楼  rainstormmaster   (暴风雨 v2.0)   回复于 2003-11-09 15:03:09  得分 0 
//可不可以不用FSO。应该有其他的办法吧
当然可以了,等会我写点代码贴上来

就用现成的例子吧:
'Create   a   form   with   a   command   button   (command1),   a   list   box   (list1)
'and   four   text   boxes   (text1,   text2,   text3   and   text4).
'Type   in   the   first   textbox   a   startingpath   like   c:\(这里你输入共享文件夹的路径,如:
\\ns\mytest试试)
'and   in   the   second   textbox   you   put   a   pattern   like   *.*   or   *.txt

Private   Declare   Function   FindFirstFile   Lib   "kernel32"   Alias   "FindFirstFileA"   (ByVal   lpFileName   As   String,   lpFindFileData   As   WIN32_FIND_DATA)   As   Long
Private   Declare   Function   FindNextFile   Lib   "kernel32"   Alias   "FindNextFileA"   (ByVal   hFindFile   As   Long,   lpFindFileData   As   WIN32_FIND_DATA)   As   Long
Private   Declare   Function   GetFileAttributes   Lib   "kernel32"   Alias   "GetFileAttributesA"   (ByVal   lpFileName   As   String)   As   Long
Private   Declare   Function   FindClose   Lib   "kernel32"   (ByVal   hFindFile   As   Long)   As   Long

Const   MAX_PATH   =   260
Const   MAXDWORD   =   &HFFFF
Const   INVALID_HANDLE_VALUE   =   -1
Const   FILE_ATTRIBUTE_ARCHIVE   =   &H20
Const   FILE_ATTRIBUTE_DIRECTORY   =   &H10
Const   FILE_ATTRIBUTE_HIDDEN   =   &H2
Const   FILE_ATTRIBUTE_NORMAL   =   &H80
Const   FILE_ATTRIBUTE_READONLY   =   &H1
Const   FILE_ATTRIBUTE_SYSTEM   =   &H4
Const   FILE_ATTRIBUTE_TEMPORARY   =   &H100

Private   Type   FILETIME
        dwLowDateTime   As   Long
        dwHighDateTime   As   Long
End   Type

Private   Type   WIN32_FIND_DATA
        dwFileAttributes   As   Long
        ftCreationTime   As   FILETIME
        ftLastAccessTime   As   FILETIME
        ftLastWriteTime   As   FILETIME
        nFileSizeHigh   As   Long
        nFileSizeLow   As   Long
        dwReserved0   As   Long
        dwReserved1   As   Long
        cFileName   As   String   *   MAX_PATH
        cAlternate   As   String   *   14
End   Type
Function   StripNulls(OriginalStr   As   String)   As   String
        If   (InStr(OriginalStr,   Chr(0))   >   0)   Then
                OriginalStr   =   Left(OriginalStr,   InStr(OriginalStr,   Chr(0))   -   1)
        End   If
        StripNulls   =   OriginalStr
End   Function

Function   FindFilesAPI(path   As   String,   SearchStr   As   String,   FileCount   As   Integer,   DirCount   As   Integer)
        'KPD-Team   1999
        'E-Mail:   KPDTeam@Allapi.net

        Dim   FileName   As   String   '   Walking   filename   variable...
        Dim   DirName   As   String   '   SubDirectory   Name
        Dim   dirNames()   As   String   '   Buffer   for   directory   name   entries
        Dim   nDir   As   Integer   '   Number   of   directories   in   this   path
        Dim   I   As   Integer   '   For-loop   counter...
        Dim   hSearch   As   Long   '   Search   Handle
        Dim   WFD   As   WIN32_FIND_DATA
        Dim   Cont   As   Integer
        If   Right(path,   1)   <>   "\"   Then   path   =   path   &   "\"
        '   Search   for   subdirectories.
        nDir   =   0
        ReDim   dirNames(nDir)
        Cont   =   True
        hSearch   =   FindFirstFile(path   &   "*",   WFD)
        If   hSearch   <>   INVALID_HANDLE_VALUE   Then
                Do   While   Cont
                DirName   =   StripNulls(WFD.cFileName)
                '   Ignore   the   current   and   encompassing   directories.
                If   (DirName   <>   ".")   And   (DirName   <>   "..")   Then
                        '   Check   for   directory   with   bitwise   comparison.
                        If   GetFileAttributes(path   &   DirName)   And   FILE_ATTRIBUTE_DIRECTORY   Then
                                dirNames(nDir)   =   DirName
                                DirCount   =   DirCount   +   1
                                nDir   =   nDir   +   1
                                ReDim   Preserve   dirNames(nDir)
                        End   If
                End   If
                Cont   =   FindNextFile(hSearch,   WFD)   'Get   next   subdirectory.
                Loop
                Cont   =   FindClose(hSearch)
        End   If
        '   Walk   through   this   directory   and   sum   file   sizes.
        hSearch   =   FindFirstFile(path   &   SearchStr,   WFD)
        Cont   =   True
        If   hSearch   <>   INVALID_HANDLE_VALUE   Then
                While   Cont
                        FileName   =   StripNulls(WFD.cFileName)
                        If   (FileName   <>   ".")   And   (FileName   <>   "..")   Then
                                FindFilesAPI   =   FindFilesAPI   +   (WFD.nFileSizeHigh   *   MAXDWORD)   +   WFD.nFileSizeLow
                                FileCount   =   FileCount   +   1
                                List1.AddItem   path   &   FileName
                        End   If
                        Cont   =   FindNextFile(hSearch,   WFD)   '   Get   next   file
                Wend
                Cont   =   FindClose(hSearch)
        End   If
        '   If   there   are   sub-directories...
        If   nDir   >   0   Then
                '   Recursively   walk   into   them...
                For   I   =   0   To   nDir   -   1
                        FindFilesAPI   =   FindFilesAPI   +   FindFilesAPI(path   &   dirNames(I)   &   "\",   SearchStr,   FileCount,   DirCount)
                Next   I
        End   If
End   Function
Sub   Command1_Click()
        Dim   SearchPath   As   String,   FindStr   As   String
        Dim   FileSize   As   Long
        Dim   NumFiles   As   Integer,   NumDirs   As   Integer
        Screen.MousePointer   =   vbHourglass
        List1.Clear
        List1.Visible   =   False
        SearchPath   =   Text1.Text
        FindStr   =   Text2.Text
        FileSize   =   FindFilesAPI(SearchPath,   FindStr,   NumFiles,   NumDirs)
        Text3.Text   =   NumFiles   &   "   Files   found   in   "   &   NumDirs   +   1   &   "   Directories"
        Text4.Text   =   "Size   of   files   found   under   "   &   SearchPath   &   "   =   "   &   Format(FileSize,   "#,###,###,##0")   &   "   Bytes"
        Screen.MousePointer   =   vbDefault
        List1.Visible   =   True
End   Sub

Top
20楼  a11s   (全面进入.Net DirectX研究中...)   回复于 2003-11-09 16:41:21  得分 0 
我的Win98开共享方法基本上跟您的是一样的
我先试试FindFirstFile...
这几个API平时用的不多。看来一般也就这个时候用了
=======正在尝试=========== 

Top
21楼  WilliamXiaoLiang   (QQ:390958177)   回复于 2003-11-09 16:46:16  得分 0 
up! 

Top
22楼  a11s   (全面进入.Net DirectX研究中...)   回复于 2003-11-09 17:13:52  得分 0 
可以查看目录了
谢谢rainstormmaster
================================
总体解决办法是这样的:
1   根据操作系统决定使用哪一个DLL建立共享
2   利用   动力港湾   提出的的mpr.dll建立连接(经检查winMe有,win98就不知道了)
3   按照rainstormmaster提出的方法进行列表
4   然后open.....get..   put   ..close
5   (好像少了关闭网络连接)(好像也没听说过)(但是Net   use   有/delete的)
================================
之差最后一步了,完成之后就可以结帖了
小生能够得到诸位大哥的帮助深感荣幸,在这里谢谢大家了。 

Top
23楼  zqfleaf   (动力港湾)   回复于 2003-11-09 17:32:38  得分 0 
加上定义:
        Private   Declare   Function   WNetDisconnectDialog   Lib   "mpr.dll"   (ByVal   hWnd   As   Long,   ByVal   dwType   As   Long)   As   Long

  Public   Function   DisconnectNetworkDialog()   As   Long       
          DisconnectNetworkDialog   =   WNetDisconnectDialog(0&,   RESOURCETYPE_DISK)
  End   Function

=========
在程序中call   DisconnectNetworkDialog()
会弹出一个联接对话框,选择哪一个断开,就可以断开了。 

Top
24楼  zqfleaf   (动力港湾)   回复于 2003-11-09 17:41:29  得分 95 
不行试试这个:
        Public   Declare   Function   WNetCancelConnection2   Lib   "mpr.dll"   Alias   "WNetCancelConnection2A"   (ByVal   lpName   As   String,   ByVal   dwFlags   As   Long,   ByVal   fForce   As   Long)   As   Long


然后:
    call   WNetCancelConnection2("\\servername",1,true) 

Top
25楼  taosihai1only   (无招胜有招)   回复于 2003-11-09 18:15:04  得分 5 
好,关注中..... 

Top
26楼  a11s   (全面进入.Net DirectX研究中...)   回复于 2003-11-09 18:54:55  得分 0 
'经过我的测试,两种方法都可以实现。现在把它整理出来
'=============================================
Option   Explicit
Private   Const   RESOURCETYPE_DISK   =   &H1
Private   Const   RESOURCETYPE_ANY   =   &H0
Private   Const   RESOURCETYPE_PRINT   =   &H2
Private   Const   RESOURCETYPE_UNKNOWN   =   &HFFFF
Private   Declare   Function   WNetCancelConnection2   Lib   "mpr.dll"   Alias   "WNetCancelConnection2A"   (ByVal   lpName   As   String,   ByVal   dwFlags   As   Long,   ByVal   fForce   As   Long)   As   Long

  Private   Declare   Function   WNetDisconnectDialog   Lib   "mpr.dll"   (ByVal   hWnd   As   Long,   ByVal   dwType   As   Long)   As   Long

  Public   Function   DisconnectNetworkDialog()   As   Long
  DisconnectNetworkDialog   =   WNetDisconnectDialog(0&,   RESOURCETYPE_DISK)
  End   Function


Private   Sub   Command1_Click()   '第一种方法
Call   DisconnectNetworkDialog
End   Sub

Private   Sub   Command2_Click()'   第二种方法
Call   WNetCancelConnection2("\\10.0.0.1\temp",   1,   True)
End   Sub 

Top
27楼  a11s   (全面进入.Net DirectX研究中...)   回复于 2003-11-09 19:09:14  得分 0 
现在可以说问题已经解决了
虽然还有一些小小的问题,比如列出文件列表时有时会溢出。这个我会自己想办法解决的
本来只想问一下如何连接的谁知道热心的rainstormmaster连98下的共享都列出来了。再次感谢rainstormmaster的帮助。
总结:
其实回过头来看看,这个问题的答案其实并不困难。是我想的太复杂了。没想到简单的FindFirstFile、FindNextFile解决了我的问题。还有远程文件的访问居然可以直接Open...
真是应了这句话:“没有做不到,只有想不到”

还有感谢   动力港湾   提供的mpr.dll的使用方法。原来只是映射网络驱动器,没有想到不用映射也可以建立连接。又是一个“没想到”。建议大家以后遇到问题时多多尝试一下。说不定就成功了呢   ^o^

还有感谢帮忙UP的热心人。
最后祝愿大家事业有成!
=======================================================
(如果没有什么补充我就要结帖了) 

Top
28楼  dreamreality   (追梦)   回复于 2004-02-02 19:39:29  得分 0 
up 

 


本站文章旨在为该问题提供解决思路及关键性代码,并不能完成应该由网友自己完成的所有工作,请网友在仔细看文章并理解思路的基础上举一反三、灵活运用。

access911.net 原创文章,作者本人对文章保留一切权利。
如需转载必须征得作者同意并注明本站链接

 

 
相关文章
     没有手动相关文章
     如何用代码创建链接表链接到 SQL SERVER 并且保存密码?
     如何用 VBA 新建链接表
     如何链接有密码保护的数据库?如何链接打开加密的数据库?
     如何使用ADOX/DAO刷新/更新/删除并重定义链接表 
     如何用代码重新链接 ODBC 链接表?1
 
评论
     查看或发表更多的评论,请单击这里。
 
 
 
 
 
   
  Access911.net   |   a9BBS   |   OTaA System   |
建站日期:2000年4月2日  |  设计施工:陈格 ( access911 & cg1 )
 Copyright © 2000 - 2003 COMET, 陈格 保留所有权利