假设一些Windows服务使用的代码需要映射网络驱动器,而不需要UNC路径。当服务启动时,如何使驱动器映射可用于服务的会话?作为服务用户登录并创建持久映射将不会在实际服务的上下文中建立映射。


当前回答

找到一种方法授予Windows服务访问网络驱动器。

以Windows Server 2012自带NFS磁盘为例:

步骤1:写一个批处理文件挂载。

写一个批处理文件,例如:C:\mount_nfs.bat

echo %time% >> c:\mount_nfs_log.txt
net use Z: \\{your ip}\{netdisk folder}\ >> C:\mount_nfs_log.txt 2>&1

步骤2:将磁盘挂载为NT AUTHORITY/SYSTEM。

打开“Task Scheduler”,创建一个新任务:

运行“系统”,在“系统启动”。 创建操作:运行"C:\mount_nfs.bat"。

经过这两个简单的步骤,我的Windows ActiveMQ服务在“本地系统”特权下运行,无需登录即可完美执行。

其他回答

您既不想从“System”更改服务运行的用户,也不想找到一种狡猾的方式将映射运行为System。

有趣的是,这可以通过使用“at”命令,简单地将您的驱动器映射安排到未来一分钟,它将在系统帐户下运行,使驱动器对您的服务可见。

你可以使用'net use'命令:

var p = System.Diagnostics.Process.Start("net.exe", "use K: \\\\Server\\path");
var isCompleted = p.WaitForExit(5000);

如果这在服务中不起作用,请尝试Winapi和PInvoke WNetAddConnection2

编辑:显然我误解你了——你不能改变服务的源代码,对吗?在这种情况下,我会遵循mdb的建议,但稍微改变一下:创建自己的服务(让我们称之为映射服务)来映射驱动器,并将这个映射服务添加到第一个(实际工作的)服务的依赖项中。这样,在映射服务启动(并映射驱动器)之前,工作服务将不会启动。

我发现了一个解决方案,它与使用psexec的解决方案类似,但不需要额外的工具就可以工作,并且可以在重新启动后继续工作。

只需添加一个计划任务,在“作为运行”字段中插入“system”,并使用简单的命令将任务指向一个批处理文件

net use z: \servername\sharedfolder /persistent:yes

然后选择“在系统启动时运行”(或类似的,我没有英文版本),你就完成了。

找到一种方法授予Windows服务访问网络驱动器。

以Windows Server 2012自带NFS磁盘为例:

步骤1:写一个批处理文件挂载。

写一个批处理文件,例如:C:\mount_nfs.bat

echo %time% >> c:\mount_nfs_log.txt
net use Z: \\{your ip}\{netdisk folder}\ >> C:\mount_nfs_log.txt 2>&1

步骤2:将磁盘挂载为NT AUTHORITY/SYSTEM。

打开“Task Scheduler”,创建一个新任务:

运行“系统”,在“系统启动”。 创建操作:运行"C:\mount_nfs.bat"。

经过这两个简单的步骤,我的Windows ActiveMQ服务在“本地系统”特权下运行,无需登录即可完美执行。

使用此信息的风险自负。(我已经在XP和Server 2008 x64 R2上进行了测试)

对于这个hack,你将需要SysinternalsSuite由Mark Russinovich:

第一步: 打开提升的cmd.exe提示符(以管理员身份运行)

第二步: 使用PSExec.exe再次提升到根目录: 导航到包含SysinternalsSuite的文件夹并执行以下命令 Psexec -i -s cmd.exe 您现在处于nt authority\系统的提示符中,您可以通过键入whoami来证明这一点。需要使用-i是因为驱动器映射需要与用户交互

第三步: 使用以下命令将持久映射驱动器创建为SYSTEM帐户 Net使用z: \\servername\sharedfolder /persistent:yes

就是这么简单!

警告:您只能从SYSTEM帐户中删除与创建映射相同的映射。如果您需要删除它,请按照步骤1和步骤2执行,但将步骤3中的命令更改为net use z: /delete。

注意:新创建的映射驱动器现在会出现在这个系统的所有用户面前,但他们会看到它显示为“断开连接的网络驱动器(Z:)”。别被名字骗了。它可能声称是断开连接的,但它对每个人都适用。这就是为什么你可以告诉这个黑客是不支持的M$。