问题:如何做浏览局域网内其它电脑目录结构的目录选择框?在 SQL Server 中,用“企业管理器”做“备份/恢复”时,选择文件位置时会出现一个目录选择框。这个选择框与普通目录选择不一样的地方,就是它里面浏览的是 SQL server 所安装的那台电脑的目录,而不是安装“企业管理器”这台电脑的目录。比如:A电脑安装了 sql server,B电脑上做备份,B上浏览的目录是 A 电脑上的。要知道,安装 SQL Server 的电脑并没有共享任何目录,但从客户端电脑却可以看到它的所有目录及文件,这是如何实现的?高手们都来探讨一下,用VB有没有实现的可能。

解决方案 »

  1.   

    mingtian2008 说得有道理,问题是用什么原理实现的?客户端要与 sql server 通信,肯定是具有某种访问 server 的权限的。现在就是希望能找出一个办法来实现它,既然“企业管理器”能做到,VB应该也有办法做到吧!
      

  2.   

    //比如:A电脑安装了 sql server,B电脑上做备份,B上浏览的目录是 A 电脑上的。
    你确认完全没有共享吗?比如说有ADMIN$共享吗?你先关闭A电脑的ADMIN$共享,重起后,再试试在B上浏览如果关闭A电脑的ADMIN$共享后,在B电脑仍然能浏览A电脑上的文件夹的话,请跟帖
      

  3.   

    ADMIN$是默认共享,肯定有的。删除该默认共享,“企业管理器”一样工作得好好的。局域网内有 sql server 的朋友都可试试。个人猜测:它的应用原理与共享不相干,应该是由 sql server 将目录信息以某种方式发送到了客户端,然后再组织出界面。sql serve 在 server 上一般由 system 用户来执行,它拥有这个权限。反过来说,只有当电脑上安装了 sql server ,这个功能才能实现;对普通无共享的电脑要实现目录浏览,无法实现。
      

  4.   

    不过话说回来,即使该目录浏览功能只对安装有 sql server 的电脑有效,如果能用VB实现也是非常有用的----我们可以用VB来做交互式的备份 sql server 功能。
      

  5.   

    To: rainstormmaster(暴风雨 v2.0) 
    哈哈,不是吹的,看了你的留言我還真去試了呢
    我把A電腦上的ADMIN$停止共享後依舊能A電腦上的目錄結構
      

  6.   

    确实是把路径发送过来的,SQL Server又多了一个安全漏洞
      

  7.   

    同意  fxy_2002(阿勇) 的說法, 應該是Sql Server的服務端通過TCP端口將服務器端的信息發送過來的.
      

  8.   

    //ADMIN$是默认共享,肯定有的。删除该默认共享,“企业管理器”一样工作得好好的。局域网内有 sql server 的朋友都可试试。这样的话,就说明目录是传送过来的,这个用VB可以实现,如果要做这个的话,建议用XML做中间层
      

  9.   

    rainstormmaster(暴风雨 v2.0):如果自己做中间层,那不是还要做个服务端?我的想法是:既然 sql server 可以将信息提供给“企业管理器”,应该也能提供给其它程序。所以希望不做服务端,直接利用 sql server 的该传送功能。问题是:如果获得传送过来的信息?调用的是 API?还是DMO?...
      

  10.   

    //我的想法是:既然 sql server 可以将信息提供给“企业管理器”,应该也能提供给其它程序。所以希望不做服务端,直接利用 sql server 的该传送功能。问题是:如果获得传送过来的信息?调用的是 API?还是DMO?...这个比较困难,因为我们不知道sql server 传送过来的是什么,是字串?是文件?还是对象?而如果我们自己写服务端的话,则不存在这个问题当然,不排除调用api实现的可能
      

  11.   

    看来是个难题啊!
    在 google 也没找到相关资料。
      

  12.   

    传送的是字符串,要每台机器都装SQL server显然不现实
    还不如自己写个程序传送
      

  13.   

    to:crycoming(瞎编)
    是的,要浏览其它电脑的目录,如果不使用服务端,显然不现实。
    我提出此问题并非实际需要,而是作为一种技术探讨,希望能找到类似 sql server 实现的方法,看看有没有捷径。
      

  14.   

    今天查到一些资料,利用 ms sql 的 SQLNamespace 对象库,可以调用到“企业管理器”中的那个“备份/恢复”窗口,在那个窗口中可以激活目录选择框。
    现在正在研究,看看能不能独立调用到那个目录选择窗。网上关于 SQLNamespace 的资料真是少之又下,无头绪中...以下代码可以调用到“企业管理器”的备份窗:'------------------------------------
    ' 调用 SQLNamesapce 备份数据库
    '------------------------------------
    Function SQLBackup(ByVal sServerName As String, ByVal sDBName As String, ByVal sUid As String, ByVal sPwd As String, ByVal hWnd As Long) As BooleanOn Error GoTo aErr    Dim objSQLNS As New SQLNS.SQLNamespace          'SQLNS命名空间
        Dim objSQLNSObj As SQLNS.SQLNamespaceObject     'SQLNS命名空间对象
        Dim objSQLNSCom As SQLNS.SQLNamespaceCommand    'SQLNS命名空间命令对象
        
        Dim hItem As Long   '句柄
        
        objSQLNS.Initialize "Backup Database;", SQLNSRootType_Database, "Server=" & sServerName & ";UID=" & sUid & ";PWD=" & sPwd & ";Database=" & sDBName & ";", hWnd
        hItem = objSQLNS.GetRootItem     '生成SQLNS命名空间对象
        
        Set objSQLNSObj = objSQLNS.GetSQLNamespaceObject(hItem)
              
        '显示 Enterprist Manager 备份界面
        Set objSQLNSCom = objSQLNSObj.Commands(10)
        objSQLNSCom.Execute hWnd, SQLNamespace_PreferModal    SQLBackup = True
        
    aErr:
        
        Set objSQLNS = Nothing
        Set objSQLNSObj = Nothing
        Set objSQLNSCom = Nothing
        
    End Function
      

  15.   

    強啊樓主
    根據您的思路我查看了一下objSQLNSObj.Commands(10)中不同常數的意義
        '1 : 刪除資料庫--DataBaseName 界面
        '2 : 某數據庫的屬性 界面
        '3 : 無
        '4 : DTS 匯入/匯出精靈 界面(匯入)
        '5 : DTS 匯入/匯出精靈 界面(匯出)
        '6 : 建立發行集精靈 界面
        '7 : 正在連線...(太快看不清)
        '8 : 提取訂閱精靈 界面
        '9 : SQL Server 安全性 界面
        '10: 備份 界面
        '11: 還原 界面
        '12: 壓縮資料庫 界面
        '13: 產生SQL指令碼 界面
    從14開始好像沒有了,不知對不對
      

  16.   

    DengXingJie(杰西) :
    运行以下代码,可以得到 SQLNS.commands 支持的操作:Dim i As Integer
    For i = 1 To objSQLNSObj.Commands.Count
        Debug.Print i & "," & objSQLNSObj.Commands(i).Name
    Next结果:
    1,删除
    2,属性
    3,数据库维护计划
    4,数据导入
    5,数据导出
    6,新建发布
    7,解决冲突
    8,新建请求订阅
    9,管理 SQL Server 安全性
    10,备份数据库
    11,还原数据库
    12,收缩数据库
    13,生成脚本
      

  17.   

    SQLNS 对象除了上面的调用,还有更复杂的。
    真要研究,很复杂。比如仅 SQLNS_CmdID 一种参数,就有好几十个。看下面一段代码,可以查看某个表的属性页:
    '----------------------------------------
    ' 调用 MS SQL Enterprist Manager 功能,
    ' 显示 Table 属性页
    '----------------------------------------
    Function SQLNSExecute(ByVal strSQLSvr As String, ByVal strSQLUid As String, ByVal strSQLPwd As String, _
        ByVal strSQLDatabase As String, ByVal strTableName As String, ByVal hWnd As Long) As BooleanOn Error GoTo aErr    Dim oSQLNS As New SQLNamespace
        Dim objSQLNSObj As SQLNS.SQLNamespaceObject
        
        Dim eSQLNSRootType As Long, hRootItem As Long
        Dim hDatabases As Long, hDatabase As Long
        Dim hTables As Long, hTable As Long
        
        eSQLNSRootType = SQLNSRootType_Server
        oSQLNS.Initialize "SQLNS Application;", eSQLNSRootType, "Server=" & strSQLSvr & ";UID=" & strSQLUid & ";pwd=;" & strSQLPwd, hWnd
        
        hRootItem = oSQLNS.GetRootItem
        hDatabases = oSQLNS.GetFirstChildItem(hRootItem, SQLNSOBJECTTYPE_DATABASES)
        hDatabase = oSQLNS.GetFirstChildItem(hDatabases, SQLNSOBJECTTYPE_DATABASE, strSQLDatabase)
        hTables = oSQLNS.GetFirstChildItem(hDatabase, SQLNSOBJECTTYPE_DATABASE_TABLES)
        hTable = oSQLNS.GetFirstChildItem(hTables, SQLNSOBJECTTYPE_DATABASE_TABLE, strTableName)
        
        Set objSQLNSObj = oSQLNS.GetSQLNamespaceObject(hTable)
        objSQLNSObj.ExecuteCommandByID SQLNS_CmdID_PROPERTIES, hWnd, SQLNamespace_PreferModal
        
        SQLNSExecute = True
        
    aErr:
        
        Set oSQLNS = Nothing
        Set objSQLNSObj = NothingEnd Function