【问题标题】:Connecting to a network drive programmatically and caching credentials以编程方式连接到网络驱动器并缓存凭据
【发布时间】:2011-02-17 17:15:57
【问题描述】:

我终于可以通过 VPN 在家工作(使用 Shrew 作为客户端),但我只有一个烦恼。我们使用一些批处理文件将配置文件上传到网络驱动器。在工作和我的团队负责人的笔记本电脑上工作正常,但这两台机器都在域中。我的家庭系统不是,也不会是,所以当我运行批处理文件时,由于我不是域用户,我收到大量“无效驱动器”错误。

到目前为止我找到的解决方案是使用以下内容制作一个批处理文件:

explorer \\MACHINE1
explorer \\MACHINE2
explorer \\MACHINE3

然后在每台机器弹出时使用我的域凭据手动登录。不幸的是,我可能需要使用大约 10 台机器,如果我错过了批处理文件所需的密码,我会很痛苦地继续输入密码。

我正在研究使用this question 的答案来制作一个小 C# 应用程序,该应用程序将获取登录信息一次并以编程方式登录。身份验证会自动与 Explorer 共享,还是有什么特别需要我做的?如果确实有效,凭据会缓存多长时间?

有没有可以自动执行此类操作的应用程序?

很遗憾,我们的管理员表示,无法通过 VPN 进行域身份验证。

编辑:如果有办法通过命令行将登录信息传递给 Explorer,那么使用 Ruby 和 highline 会更容易。

编辑:如果其他人有同样的问题,这是我最终使用的解决方案。它需要 Ruby 和 Highline gem。

require "highline/import"

domain = ask("Domain: ")
username = ask("Username: ")
password = ask("Password: ") { |q| q.echo = false }

machines = [
    '\\MACHINE1\SHARE', 
    '\\MACHINE2\SHARE', 
    '\\MACHINE3\SHARE', 
    '\\MACHINE4\SHARE', 
    '\\MACHINE5\SHARE'
]
drives = ('f'..'z').to_a[-machines.length..-1]

drives.each{|d| system("net use #{d}: /delete >nul 2>nul"); }

machines.zip(drives).each{|machine, drive| system("net use #{drive}: #{machine} #{password} /user:#{domain}\\#{username} >nul 2>nul")}

它会计算出我需要多少个映射驱动器,然后开始将它们映射到请求的共享。在这种情况下,它将它们从 V: 映射到 Z:,并假设我没有与这些驱动器号共享任何内容。

如果你已经有一个资源管理器窗口打开了一个共享,它可能会出错,所以在我运行 Ruby 脚本之前,我运行了:

net use * /delete

这清除了“不允许共享的多个连接”错误,并允许我毫无问题地连接。

【问题讨论】:

    标签: c# login vpn


    【解决方案1】:

    您可以创建一个使用“NET USE”连接到您的共享的批处理文件。您需要为每个共享使用一个驱动器号,但实现起来非常简单。

    您的批处理文件如下所示:

    net use h: \\MACHINE1 <password> /user:<domain>\<user>
    net use i: \\MACHINE2 <password> /user:<domain>\<user>
    net use j: \\MACHINE3 <password> /user:<domain>\<user>
    

    更新

    连接是否保持取决于您为 /persistent 开关指定的内容。如果您指定是,那么它将在您下次登录时尝试重新连接。如果您指定否,则不会。令人担忧的是 documentation 表示它默认为您上次使用的值!

    如果您指定否,连接将保持到您下次重新启动。如果您删除VPN连接,则驱动器将不可用(但如果您重新连接到VPN,则只要您尚未删除它,驱动器应使用)。

    我不知道如何在不映射到驱动器号的情况下使用它,文档会让您相信这是不可能的。

    我了解您的问题,您只是想为资源管理器提供正确的凭据,这样它就不会再用登录框唠叨您了。使用映射驱动器虽然并不完美,但至少可以减轻您的痛苦。

    【讨论】:

    • 在下面查看我对 Oliver 的评论。有没有办法不必映射驱动器?删除“/SAVECRED”让它映射驱动器,所以从技术上讲,它可以工作,但它会保留凭证多长时间?如果我断开与域的 VPN 连接,它会挂起,还是无法访问?
    【解决方案2】:

    通过 P/Invoke 使用 API WNetAddConnection2()。

    【讨论】:

      【解决方案3】:

      要通过命令行将凭据传递给资源管理器,您应该查看命令net use

      【讨论】:

      • 我也在调查这个问题。不过,我不想映射驱动器。我正在尝试“net use z:\\MACHINE1 password /USER:DOMAIN\username /SAVECRED”,我得到“一个命令与冲突的开关一起使用”。有任何想法吗?可以在不映射驱动器的情况下完成吗?
      猜你喜欢
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      • 2023-01-27
      • 1970-01-01
      • 1970-01-01
      • 2012-01-04
      • 2011-02-14
      • 1970-01-01
      相关资源
      最近更新 更多