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

问题描述:

我想网络驱动器从Windows服务地图,我使用批处理文件执行批处理文件,无论是在服务的构造或处理通信事件中执行以下命令如何从Windows服务映射网络驱动器?

NET USE U: \\192.168.55.6\folder password 

,驱动器没有映射?

 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服务映射网络驱动器?

+3

我不知道为什么你的连接出现故障,但为什么不直接从您的代码进行映射,而非炮击,以NET.EXE? http://pinvoke.net/default.aspx/mpr/WNetAddConnection2.html会给你一个错误代码,这将有助于你进行调试。 – 2009-04-27 10:52:14

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

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

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

+0

这也不起作用。 – Ahmed 2009-04-27 09:55:48

+0

你能记录地图命令的输出吗?例如:“net use ...> c:\ map.log” – Andomar 2009-04-27 10:46:39

+0

这应该不重要我认为 - 网络映射不由shell管理。它们是内核级链接。请参阅SysInternals中的WinObj。 – MSalters 2009-04-27 10:50:22

您是否在属于密码的用户帐户下运行服务? MAP USE命令将使用当前用户,除非您通过/ USER:另一个用户

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

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

这可能是也可能不是真的,但值得研究 - 我从7年前的一个类似场景中记住了一些事情。

这里有两个问题:

  1. 映射只在使用用户会话,这意味着有效地你不能使用映射驱动器的服务。您需要使用路径。
  2. 第二个问题是服务(使用本地系统帐户) 无法访问网络,或者更具体地说,无法访问所需的资源 。要解决此问题,您需要执行以下任一操作:给 运行服务的“计算机”特定访问 该文件夹,或者设置该服务以使用可访问该服务的网络(DOMAIN)帐户 资源。

这可以通过使用对Windows Script Host Object Model的引用来实现。

添加对的Windows引用的Windows脚本宿主对象模型,它向参考部分添加条目IWshRuntimeLibrary。现在您可以使用以下代码来映射驱动器。

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