我们在使用C#.Net Framework 1.1开发的Windows服务中使用以下命令行:
net use z: \\myComputer\c$
该服务在域帐户下运行,该帐户是“myComputer”上的本地管理员。调试代码后,我们可以看到它没有返回任何错误,但“z:”驱动器从未映射。我们已经尝试从控制台应用程序完全相同的代码,它可以正常工作。为了使这项工作,我们需要添加到服务中的是什么?
我们正在使用的代码包含在下面。
的问候,
塞尔吉奥
startInfo.FileName = "net";
startInfo.Arguments = string.Format(@"use {0}: \\{1}\{2}", driveLetter,
computerName, folder).Trim();
startInfo.UseShellExecute = false;
startInfo.RedirectStandardError = true;
proc.EnableRaisingEvents = false;
proc.StartInfo = startInfo;
proc.Start();
// If there is an error during the mapping of the drive, it will be read
// from the StandardError property which is a StreamReader object and
// be fed into the error output parameter.
using(StreamReader errorReader = proc.StandardError)
{
string standardError = string.Empty;
while((standardError = errorReader.ReadLine()) != null)
{
error += standardError + " ";
}
}
proc.WaitForExit();
答案 0 :(得分:16)
来自http://msdn.microsoft.com/en-us/library/ms685143.aspx:
服务(或在服务器中运行的任何进程) 不同的安全背景)必须 访问远程资源应该使用 通用命名公约(UNC) 用于访问资源的名称。该 服务必须有适当的 访问资源的权限。如果 服务器端服务使用RPC 连接,必须启用委派 在远程服务器上。
驱动器号不是全局的 系统。每个登录会话都会收到 它自己的一组驱动器号从A到 Z.因此,重定向的驱动器不能 在进程运行之间共享 在不同的用户帐户下。 此外,服务(或任何过程 在自己的登录会话中运行) 无法访问那些驱动器号 在不同的范围内建立 登录会话。
服务不应直接访问 通过本地或网络资源 映射驱动器号,也不应该 调用net use命令来映射驱动器 运行时的字母。
答案 1 :(得分:1)
您无法从Windows服务(包括注册表中的HKEY-CURRENT-USER)访问用户属性,因为该服务不会以登录用户身份运行。
映射驱动器是用户设置的一部分,因此您不能将它们用作服务,除非您仔细查看手动注册表中的用户属性,映射服务中的驱动器等等。这很痛苦。
您可能想要尝试做的是询问有关如何让您的服务执行登录序列的问题(可能是某些.EXE)。这可能适合你。
希望这有帮助, 艾伦。
答案 2 :(得分:0)
您可能需要指定用于登录的帐户。在命令提示符下键入net use /?
以获取使用该命令设置的帮助。
答案 3 :(得分:0)
我怀疑这是因为该服务没有在本地用户的上下文中运行。我记得,您可以将多年前的Windows服务配置为“与桌面交互”或类似的东西。
答案 4 :(得分:0)
我正在做类似的事情登录到远程服务器,但没有映射的驱动器部分。我不喜欢使用映射驱动器;在程序中,我总是使用subst以方便。 无论如何,我只需要确保包括
use \\server\c$ /user:admin password
或者您有权访问远程服务器的任何用户/密码,然后登录的服务无关紧要。