假设某些Windows服务使用的代码需要映射的网络驱动器而不使用UNC路径.如何在服务启动时使驱动器映射可用于服务的会话?以服务用户身份登录并创建持久映射将不会在实际服务的上下文中建立映射.
使用此风险需要您自担风险.(我在XP和Server 2008 x64 R2上测试过它)
对于这个黑客,你需要Mark Russinovich的SysinternalsSuite:
第一步: 打开提升的cmd.exe提示符(以管理员身份运行)
第二步:
使用PSExec.exe再次提升到root用户:导航到包含SysinternalsSuite的文件夹并执行以下命令,
psexec -i -s cmd.exe
您现在处于提示符内,nt authority\system
您可以通过键入来证明这一点whoami
.这-i
是必需的,因为驱动器映射需要与用户交互
第三步:
使用以下命令将持久映射驱动器创建为SYSTEM帐户
net use z: \\servername\sharedfolder /persistent:yes
就这么简单!
警告:您只能从SYSTEM帐户中以与创建映射相同的方式删除此映射.如果需要将其删除,请执行步骤1和2,但将步骤3中的命令更改为net use z: /delete
.
注意:现在将为该系统的所有用户显示新创建的映射驱动器,但它们将看到它显示为"断开网络驱动器(Z :)".不要让这个名字欺骗你.它可能声称已断开连接,但它适用于所有人.这就是M $不支持这个hack的方法.
我发现了一个与psexec类似的解决方案,但无需额外工具即可工作,并且可以在重新启动后继续使用.
只需添加一个已调整的任务,在"运行方式"字段中插入"system",并使用simple命令将任务指向批处理文件
net use z: \servername\sharedfolder /persistent:yes
然后选择"在系统启动时运行"(或类似的,我没有英文版),你就完成了.
您需要修改服务,或将其包装在帮助程序进程中:除会话/驱动器访问问题外,永久性驱动器映射仅在交互式登录时恢复,这些服务通常不会执行.
辅助进程方法可以非常简单:只需创建一个映射驱动器并启动"真实"服务的新服务.唯一不完全是微不足道的事情是:
帮助程序服务需要将所有适当的SCM命令(启动/停止等)传递给实际服务.如果真实服务接受自定义SCM命令,请记住也要传递它们(我不认为考虑UNC路径异常的服务使用此类命令,但是......)
事情可能会有点棘手的凭证.如果真实服务在普通用户帐户下运行,您也可以在该帐户下运行帮助服务,只要该帐户具有对网络共享的适当访问权限,所有服务都应该正常.如果实际服务仅在以LOCALSYSTEM或其他类似的方式运行时才会起作用,事情变得更有趣,因为它要么根本不能"看到"网络驱动器,要么需要一些凭证来完成工作.
更好的方法是使用mklink.exe使用符号链接.您可以在文件系统中创建任何应用程序都可以使用的链接.见http://en.wikipedia.org/wiki/NTFS_symbolic_link.
这里有一个很好的答案:https: //superuser.com/a/651015/299678
即你可以使用符号链接,例如
mklink /D C:\myLink \\127.0.0.1\c$
你可以使用'net use'命令:
var p = System.Diagnostics.Process.Start("net.exe", "use K: \\\\Server\\path"); var isCompleted = p.WaitForExit(5000);
如果这在服务中不起作用,请尝试使用Winapi和PInvoke WNetAddConnection2
编辑:显然我误解了你 - 你无法改变服务的源代码,对吧?在这种情况下,我将遵循建议的mdb,但有一点扭曲:创建自己的服务(让我们称之为它的地图服务),该驱动器映射并添加该映射服务为第一的依赖关系(实际工作)的服务.这样,工作服务将不会在映射服务启动之前启动(并映射驱动器).
ForcePush,
注意:现在将为该系统的所有用户显示新创建的映射驱动器,但它们将看到它显示为"断开网络驱动器(Z :)".不要让这个名字欺骗你.它可能声称已断开连接,但它适用于所有人.这就是你怎么能告诉M $不支持这个hack ...
这一切都取决于共享权限.如果您拥有共享权限中的Everyone,则其他用户可以访问此映射的驱动器.但是,如果您只有一些特定用户在批处理脚本中使用了其凭据,并且此批处理脚本已添加到启动脚本中,则只有系统帐户才能访问该共享,甚至不能访问管理员.因此,如果您使用例如计划的ntbackuo作业,则必须在"运行方式"中使用系统帐户.如果您的服务的"登录身份:本地系统帐户"应该可以使用.
我做了什么,我没有在我的启动脚本中映射任何驱动器号,只是net use \\\server\share ...
在我的预定作业中使用和使用UNC路径.添加了一个登录脚本(或者只是将批处理文件添加到启动文件夹中),net use Z: \\\...
并使用相同的凭据映射到具有某个驱动器号的相同共享.现在,已登录的用户可以查看和访问该映射的驱动器.有2个连接到同一份额.在这种情况下,用户没有看到恼人的"断开网络驱动器......".但是,如果您真的需要通过驱动器号而不仅仅是UNC访问该共享,请使用不同的驱动器号映射该共享,例如Y表示系统,Z表示用户.