首页 > 解决方案 > 使用 smb2 在 golang 中打开 Micrsoft DFS 共享

问题描述

我在 Windows Server 2012 上有一个 dfs 共享。我可以在 Windows 文件资源管理器中打开共享并从另一个系统读取文件,路径如下:\\dfsserver\usernamepace\Tom\go.png。但是,使用 https://github.com/hirochachacha/go-smb2 的 golang 的 smb2 包时出现错误

响应错误:联系的服务器不支持 DFS 命名空间的指定部分

但是,如果我尝试使用它的实际共享路径\\dfsserver\public share\Tom\go.png打开文件,则代码可以正常工作。所以问题是我不知道运行时的实际路径,我希望能够使用 DFS 提供的路径打开文件。

会不会是 DFS 不能与 smb2 一起正常工作?或其他一些问题。提前感谢您的评论。

    func main(){
    
        // actualPath := `\\dfsserver\public share\Tom\go.png`
        // dfsPath := `\\dfsserver\usernamespace\Tom\go.png`
    
        conn, err := net.Dial("tcp", fmt.Sprintf("%s:%s", "dfsserver", "445"))
        if err != nil {
            fmt.Println(err)
        }
        defer conn.Close()
    
        dial := &smb2.Dialer{
            Initiator: &smb2.NTLMInitiator{
                User:     "user",
                Password: "password",
                Domain:  "dfsserver",
            },
        }
        session, err := dial.Dial(conn)
        if err != nil {
            fmt.Println(err)
        }
        defer session.Logoff()
    
        mountPoint, err := session.Mount("usernamespace")
        if err != nil {
            fmt.Println(err)
            os.Exit(1)
        }
    
       // error occures here, if the mountPoint was "public share" instead of "usernamespace" then no error
        remoteFile, err := mountPoint.Open(`Tom\go.png`) 
        defer remoteFile.Close()
        if err != nil {
            fmt.Println(err)
        }
    }

标签: gosmbmicrosoft-distributed-file-system

解决方案


推荐阅读