以编程方式连接到网络驱动器并缓存凭据

时间:2010-05-10 14:55:48

标签: c# login vpn

我终于成立了能够通过VPN在家工作(使用Shrew作为客户端),我只有一个烦恼。我们使用一些批处理文件将配置文件上传到网络驱动器。从工作和我的团队领导的笔记本电脑工作得很好,但这两台机器都在域上。我的家庭系统不是,也不会,所以当我运行批处理文件时,我得到了大量的“无效驱动器”错误,因为我不是域用户。

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

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

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

我正在研究使用this question的答案制作一个小的C#应用​​程序,它将获取一次登录信息并以编程方式登录。身份验证是否会与资源管理器自动共享,或者我需要做些什么特别的事情?如果确实有效,凭证会缓存多长时间?

是否有自动执行此类操作的应用程序?

不幸的是,根据我们的管理员的说法,通过VPN进行域身份验证不是一种选择。

编辑:如果有办法通过命令行将登录信息传递给资源管理器,那么使用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

这清除了“不允许共享的多个连接”错误,并允许我连接没有任何问题。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

答案 2 :(得分: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开关指定的内容。如果您指定了yes,那么它将在您下次登录时尝试重新连接。如果你指定了no那么它就不会。令人担忧的是documentation表示它默认为您上次使用的值!

如果您指定为no,则连接将保持不变,直到您下次重新启动。如果丢弃VPN连接,驱动器将不可用(但如果您重新连接到VPN,则驱动器应该可用,只要您没有将其移除)。

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

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