如何从Windows服务映射网络驱动器?

时间:2009-04-27 09:41:46

标签: c# windows-services network-drive

我正在尝试从Windows服务映射网络驱动器,我使用批处理文件执行以下命令

NET USE U: \\192.168.55.6\folder password

在服务构造函数或onstart事件中执行批处理文件时,是否未映射驱动器?

        Process process = new Process();
        process.StartInfo.FileName = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "\\MAP.BAT";
        process.StartInfo.CreateNoWindow = false;
        process.Start();

如何从Windows服务映射网络驱动器?

7 个答案:

答案 0 :(得分:5)

这可以使用对Windows脚本宿主对象模型的引用来实现。

Windows脚本宿主对象模型添加COM引用,该引用将IWshRuntimeLibrary条目添加到references部分。现在,您可以使用以下代码映射驱动器。

using IWshRuntimeLibrary;

IWshNetwork_Class network = new IWshNetwork_Class();
network.MapNetworkDrive("k:",@"\\192.168.20.35\MyShare", Type.Missing, "user1", "password1");

您可以使用以下代码进行UnMap或删除映射。

network.RemoveNetworkDrive("k:");

我已经记录了详细步骤here

答案 1 :(得分:2)

使用Map Network Drive (API)映射网络驱动器解决了所有问题。我在OnStart服务事件中映射了所需的驱动器。

答案 2 :(得分:1)

最好只调用正确的API函数,而不是调用批处理文件来调用另一个可执行文件。您正在寻找的功能是DefineDosDevice()

答案 3 :(得分:1)

有两个问题:

  1. 映射仅用于用户会话,这意味着您无法有效地使用映射驱动器进行服务。您需要使用路径。
  2. 第二个问题是服务(使用本地系统帐户) 无权访问网络,或更具体地说,访问网络 所需资源。要解决这个问题,您需要:Give 服务运行特定访问权限的“计算机” 文件夹,或设置服务以使用网络(DOMAIN)帐户 有权访问资源。

答案 4 :(得分:0)

我认为服务无法映射网络驱动器,除非他们有正确的“与桌面交互”?

尝试在“网络服务”帐户下运行服务,而不是“本地系统”?

答案 5 :(得分:0)

您是否在属于密码的用户帐户下运行服务?除非您传递/ USER:anotheruser

,否则MAP USE命令将使用当前用户

答案 6 :(得分:0)

据我所知,映射驱动器仅映射用户会话的持续时间。如果您的Windows服务在启动时运行,或者不是用户会话的一部分,则驱动器映射将丢失。

这可能是也可能不是,但值得研究 - 我记得7年前的类似情况。