当前位置:  开发笔记 > 开发工具 > 正文

映射要由服务使用的网络驱动器

如何解决《映射要由服务使用的网络驱动器》经验,为你挑选了7个好方法。

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



1> 小智..:

使用此风险需要您自担风险.(我在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的方法.


要在重新启动后使其正常工作,请创建一个包含`net use z:\\ servername\sharedfolder`的脚本,并将其设置为在计算机启动时运行,请访问http://technet.microsoft.com/en-us/library/ cc770556.aspx这将作为SYSTEM帐户运行,因此不需要psexec.
重新启动后,映射的驱动器消失了.任何想法?映射是持久的,但状态是"不可用",因此它不会显示
重启后我也看到映射不可用.
我试图使用此解决方案并遇到此问题:映射的驱动器显示为与用户(甚至是管理员)断开连接.有什么建议?
我想补充一点,每个人都使用`/ USER:[remotecomp]\[remoteusername] [password]`这个句子很重要(当远程用户名不在远程用户名和反斜杠之前时,命令有时不能正常工作.此外,如果共享受密码保护,并且其他人显示为已断开连接的驱动器,那么每个人都无法访问它.系统上安装共享的任何用户必须知道该共享的密码. XPx64)

2> 小智..:

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

只需添加一个已调整的任务,在"运行方式"字段中插入"system",并使用simple命令将任务指向批处理文件

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

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


为什么需要成为计划任务?这是/持久性:是的,还不足以让它保持下去吗?
@ScottStafford否/持续:在Win7及更高版本上,是的还不够.无论该切换如何,重新启动后都会删除映射.

3> mdb..:

您需要修改服务,或将其包装在帮助程序进程中:除会话/驱动器访问问题外,永久性驱动器映射仅在交互式登录时恢复,这些服务通常不会执行.

辅助进程方法可以非常简单:只需创建一个映射驱动器并启动"真实"服务的新服务.唯一不完全是微不足道的事情是:

帮助程序服务需要将所有适当的SCM命令(启动/停止等)传递给实际服务.如果真实服务接受自定义SCM命令,请记住也要传递它们(我不认为考虑UNC路径异常的服务使用此类命令,但是......)

事情可能会有点棘手的凭证.如果真实服务在普通用户帐户下运行,您也可以在该帐户下运行帮助服务,只要该帐户具有对网络共享的适当访问权限,所有服务都应该正常.如果实际服务仅在以LOCALSYSTEM或其他类似的方式运行时才会起作用,事情变得更有趣,因为它要么根本不能"看到"网络驱动器,要么需要一些凭证来完成工作.


非常有用......我假设登录脚本也仅用于交互式登录会话而不是服务会话,我是否正确?

4> 小智..:

更好的方法是使用mklink.exe使用符号链接.您可以在文件系统中创建任何应用程序都可以使用的链接.见http://en.wikipedia.org/wiki/NTFS_symbolic_link.


太糟糕了,它无法在2000/XP上运行.
不幸的是,如果符号链接访问网络共享,那么您将回到第一个

5> philu..:

这里有一个很好的答案:https: //superuser.com/a/651015/299678

即你可以使用符号链接,例如

mklink /D C:\myLink \\127.0.0.1\c$



6> Treb..:

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

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

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

编辑:显然我误解了你 - 你无法改变服务的源代码,对吧?在这种情况下,我将遵循建议的mdb,但有一点扭曲:创建自己的服务(让我们称之为它的地图服务),该驱动器映射并添加该映射服务为第一的依赖关系(实际工作)的服务.这样,工作服务将不会在映射服务启动之前启动(并映射驱动器).



7> lk7777..:

ForcePush,

注意:现在将为该系统的所有用户显示新创建的映射驱动器,但它们将看到它显示为"断开网络驱动器(Z :)".不要让这个名字欺骗你.它可能声称已断开连接,但它适用于所有人.这就是你怎么能告诉M $不支持这个hack ...

这一切都取决于共享权限.如果您拥有共享权限中的Everyone,则其他用户可以访问此映射的驱动器.但是,如果您只有一些特定用户在批处理脚本中使用了其凭据,并且此批处理脚本已添加到启动脚本中,则只有系统帐户才能访问该共享,甚至不能访问管理员.因此,如果您使用例如计划的ntbackuo作业,则必须在"运行方式"中使用系统帐户.如果您的服务的"登录身份:本地系统帐户"应该可以使用.

我做了什么,我没有在我的启动脚本中映射任何驱动器号,只是net use \\\server\share ...在我的预定作业中使用和使用UNC路径.添加了一个登录脚本(或者只是将批处理文件添加到启动文件夹中),net use Z: \\\...并使用相同的凭据映射到具有某个驱动器号的相同共享.现在,已登录的用户可以查看和访问该映射的驱动器.有2个连接到同一份额.在这种情况下,用户没有看到恼人的"断开网络驱动器......".但是,如果您真的需要通过驱动器号而不仅仅是UNC访问该共享,请使用不同的驱动器号映射该共享,例如Y表示系统,Z表示用户.

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有