代码之家  ›  专栏  ›  技术社区  ›  Chris Doggett

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

  •  1
  • Chris Doggett  · 技术社区  · 16 年前

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

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

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

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

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

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

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

    编辑 :如果有一种方法可以通过命令行将登录信息传递给资源管理器,那么使用ruby和highline就更容易了。

    编辑 如果其他人也有同样的问题,这里是我最后使用的解决方案。它需要红宝石和高端宝石。

    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 回复  |  直到 16 年前
        1
  •  1
  •   Doctor Jones    16 年前

    您可以创建一个批处理文件,该文件使用“ 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,只要您没有删除驱动器,驱动器就应该可用)。

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

    我理解您的问题,您只是想给Explorer提供正确的凭证,这样它就不再用登录框来烦扰您了。使用映射驱动器虽然不完美,但至少可以减轻您的痛苦。

        2
  •  1
  •   Oliver    16 年前

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

        3
  •  1
  •   Seva Alekseyev    16 年前

    通过p/invoke使用api ownetadadconnection2()。

    推荐文章