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

Windows 映射服务要使用的网络驱动器,windows,windows-services,unc,system-administration,mapped-drive,Windows,Windows Services,Unc,System Administration,Mapped Drive,假设某些Windows服务使用的代码需要映射的网络驱动器而没有UNC路径。启动服务时,如何使驱动器映射可用于服务的会话?以服务用户身份登录并创建持久映射不会在实际服务的上下文中建立映射。您既不想从“系统”中更改服务运行时所使用的用户,也不想找到一种偷偷摸摸的方法以系统身份运行映射 有趣的是,通过使用该命令,只需将驱动器映射时间安排在未来一分钟,它将在系统帐户下运行,使驱动器对您的服务可见。您可以使用“net use”命令: var p = System.Diagnostics.Process.S

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

您既不想从“系统”中更改服务运行时所使用的用户,也不想找到一种偷偷摸摸的方法以系统身份运行映射


有趣的是,通过使用该命令,只需将驱动器映射时间安排在未来一分钟,它将在系统帐户下运行,使驱动器对您的服务可见。

您可以使用“net use”命令:

var p = System.Diagnostics.Process.Start("net.exe", "use K: \\\\Server\\path");
var isCompleted = p.WaitForExit(5000);
如果这在服务中不起作用,请尝试Winapi和PInvoke


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

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

helper进程方法可以非常简单:只需创建一个映射驱动器的新服务,并启动“真正的”服务。关于这一点,唯一不完全无关紧要的是:

  • 助手服务需要将所有适当的SCM命令(启动/停止等)传递给真正的服务。如果真正的服务接受自定义SCM命令,请记住也传递这些命令(不过,我不希望认为UNC路径奇异的服务使用此类命令…)

  • 事情可能会变得有点棘手。如果实际服务在普通用户帐户下运行,那么您也可以在该帐户下运行帮助器服务,只要该帐户具有适当的网络共享访问权限,所有这些都应该是正常的。如果真正的服务只在以LOCALSYSTEM或类似的方式运行时才能工作,那么事情会变得更有趣,因为它要么根本无法“查看”网络驱动器,要么需要一些凭证杂耍来让事情正常工作


当您通常从命令提示符下运行可执行文件时,能够访问驱动器in的原因是,当您以普通exe方式执行该文件时,您正在使用您登录的用户帐户运行该应用程序。并且该用户具有访问网络的权限。但是,当您将可执行文件作为服务安装时,默认情况下,如果在任务管理中看到它在“系统”帐户下运行。您可能知道“系统”无权访问网络资源

这个问题有两种解决方案

  • 将驱动器映射为如上所述的持久性

  • 还有一种方法可以遵循。如果您通过键入“services.msc”打开服务管理器,您可以转到您的服务,并且在服务的属性中有一个登录选项卡,您可以将该帐户指定为除“系统”之外的任何其他帐户,您可以从您自己的登录用户帐户或通过“网络服务”启动服务。当你这么做的时候。。该服务可以访问任何网络组件和驱动器,即使它们不是持久的。 要以编程方式实现这一点,您可以在以下位置查看“CreateService”函数: 并且可以将参数“lpServiceStartName”设置为“NT AUTHORITY\NetworkService”。这将在“网络服务”帐户下启动您的服务,然后您就完成了

  • 您也可以尝试通过在CreateService()函数的servicetype参数标志中指定service_interactive_PROCESS使服务成为交互式的,但这将仅限于XP as Vista和7不支持此功能


  • 希望这些解决方案对您有所帮助。。如果这对您有效,请告诉我。

    使用此工具的风险由您自己承担。(我已经在XP和Server 2008 x64 R2上对其进行了测试)

    对于此攻击,您需要:

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

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

    第三步: 使用以下命令创建持久映射驱动器作为系统帐户
    net use z:\\servername\sharedfolder/persistent:yes

    就这么简单

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


    注意:新创建的映射驱动器现在将显示在此系统的所有用户,但他们将看到它显示为“断开连接的网络驱动器(Z:)”。不要让这个名字欺骗你。它可能声称已断开连接,但对每个人都适用。这就是你如何判断M$不支持这种黑客行为的原因。

    我找到了一种解决方案,它与psexec类似,但在没有其他工具的情况下工作,并且在重新启动后仍能生存

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

    net use z: \servername\sharedfolder /persistent:yes
    
    然后选择“在系统启动时运行”(或类似的,我没有英文版本),然后您将
    echo %time% >> c:\mount_nfs_log.txt
    net use Z: \\{your ip}\{netdisk folder}\ >> C:\mount_nfs_log.txt 2>&1
    
    mklink /D C:\myLink \\127.0.0.1\c$
    
        \\servername\share  
    
        \\123.456.789.012\share 
    
    net use Q: \\share.domain.com\share 
    forfiles /p Q:\myfolder /s /m *.txt /d -0 /c "cmd /c del @path"
    net use Q: /delete