C# 无法从Windows服务访问驱动器映射网络共享上的文件

C# 无法从Windows服务访问驱动器映射网络共享上的文件,c#,windows-services,network-share,mapped-drive,C#,Windows Services,Network Share,Mapped Drive,我有一个映射到驱动器号的网络共享文件夹,可以从Windows资源管理器、命令提示符以及我的WinForms应用程序访问该文件夹,而不会出现问题。也可以使用UNC路径从我的Windows服务访问它 但是,当我尝试使用Windows服务映射的驱动器号访问此网络位置时,访问失败。Windows服务配置为使用我的个人“登录”帐户凭据,这在上述所有情况下都是相同的。我是一名管理员 许多客户站点使用驱动器号进行网络共享,我无法始终控制这一点,而是强制他们指定UNC路径。我需要能够使用Windows服务的驱动

我有一个映射到驱动器号的网络共享文件夹,可以从Windows资源管理器、命令提示符以及我的WinForms应用程序访问该文件夹,而不会出现问题。也可以使用UNC路径从我的Windows服务访问它

但是,当我尝试使用Windows服务映射的驱动器号访问此网络位置时,访问失败。Windows服务配置为使用我的个人“登录”帐户凭据,这在上述所有情况下都是相同的。我是一名管理员

许多客户站点使用驱动器号进行网络共享,我无法始终控制这一点,而是强制他们指定UNC路径。我需要能够使用Windows服务的驱动器号访问网络共享


我需要做什么来设置我的Windows服务,以便它可以访问映射到驱动器号的网络共享文件夹?我的Windows服务是用C#编写的。

映射的驱动器是每会话对象。因此,每个交互式会话都有自己的映射,而服务会话有另一个驱动器映射。为了获得映射驱动器的正确UNC路径,您需要在正确的会话中调用WNetGetConnection


您可以使用任何会话间通信方法来启动请求并在服务中获取结果,例如WCF、命名管道、套接字等。

对不起。正如Sheng所建议的,您可以使用UI进程从映射的驱动器获取UNC路径,然后将其传递给服务,服务必须使用UNC路径。

hi elan我在项目中遇到了同样的问题,我找到了解决方案

工作是否需要遵循我的步骤

                    if (api.Docusign_download(strDocuSignUserName, strDocuSignPassword, strDocuSignIntegratorKey, EnvelopeID, Environment.ExpandEnvironmentVariables("%temp%")) == true)
                    {
                        if (m_streamWriter1 != null)
                        {
                            m_streamWriter1.WriteLine(" This envelop id is  Downloaded and update the table" + EnvelopeID + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString() + "\n");
                        }

                        fpath1 = Environment.ExpandEnvironmentVariables("%temp%") + '\\' + EnvelopeID + '1' + ".pdf";
                        fpath2 = Environment.ExpandEnvironmentVariables("%temp%") + '\\' + EnvelopeID + '2' + ".pdf";
                        if (System.IO.File.Exists(fpath1))
                        {
                            fso = new FileSystemObject();
                            // fso.CopyFile(fileLoc, "\\\\Tech-Pro-01\\D\\", true); i download the file in temp folder and copy file to unc path ur expected work on reverse like access file to unc path he does not work directly but work in in direct access like temp folder to services
                            fso.CopyFile(fpath1, UNC, true);  
                            fso.CopyFile(fpath2, UNC, true);
                            fso.DeleteFile(fpath1, true);
                            fso.DeleteFile(fpath2, true);
                            //System.IO.File.Move(fileLoc, fileLocMove);
我只是在vb fso文件系统对象中使用遗留应用程序脚本

1、确保您在iuser中的映射路径访问和网络服务访问能够访问映射提供的机器 2、添加参考系统脚本

3和unc路径示例\computername\sharedname\folder\filename 4,只是fso.copyfile(uncpath,tempfoler,true) 5、你可以访问临时文件夹中的文件,他可以访问并且工作正常

临时文件夹访问“c:\windows\temp”,因为进程只能访问windows临时文件夹

希望他工作得很好

谢谢和问候

贾加迪什·戈文达拉伊·皮莱
jagadeesh1492@facebook.com

非常感谢。我能够使用pinvoke和WNetGetConnection将驱动器号转换为UNC路径!感谢您的文章。Microsoft明确指出,不应从Windows服务访问映射驱动器。引用的文章仅说明服务不应使用或更改驱动器映射,这是正确的在MS KB的文章中,它甚至暗示:“因此,重定向驱动器不能在不同用户帐户下运行的进程之间共享。换句话说,登录会话和服务必须在相同的凭据下运行。这是可以做到的。@Garen:出于安全考虑,Windows的每一个主要版本都增加了服务和桌面代码之间的分离。现在有办法迫使它工作。还有一些方法可以将其强制应用于不再工作的早期Windows版本。它不被支持;您只需创建一个产品,它可能会在未来的Windows版本中崩溃。(我是根据经验说话的…)所谓“无法访问映射驱动器”的说法是问题所在,这是一个错误的说法。最佳实践是一个完全不同的主题。您不能访问映射驱动器,就像您不能对任务管理器隐藏流程一样。两者都是可能的,但都不能使用提供的、有文档记录的API来完成。你可以破解一个解决方案来实现这两种功能,这两种破解都会在不同/未来版本的Windows上被破解。