繁体   English   中英

运行windows服务时无法访问网络驱动器

[英]Can't access the network drive while running the windows service

我正在尝试在 C# 中创建一个 Windows 服务,它将从网络驱动器复制所有文件并将其粘贴到本地驱动器(假设在 C 驱动器中)。 当我运行测试用例时,程序运行成功,但是当我安装并运行 Windows 服务时,日志文件中出现“访问被拒绝”错误。

我尝试了Map Network Drive (API)解决方案,但该解决方案不起作用。 任何一个。

这是我用来从网络驱动器获取所有文件并将其粘贴到本地驱动器文件夹的示例代码


服务1.cs

    public partial class Service1 : ServiceBase
    {
        private Timer _timer;

        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {                
            try
            {

                DoWork();

            }
            catch (Exception e)
            {
                WriteErrorLog(e);
            }

        }

        private void DoWork()
        {
            _timer = new Timer();
            _timer.Interval = 5000;
            _timer.Enabled = true;
            _timer.Elapsed += _timer_Elapsed;
            Update();
        }

        private void Update()
        {
            RevidAddinController.Update_AutodeskAddinFolder_With_ArchcorpUpdatedAddinFiles(Configuration.AutodeskVersion, Configuration.AutodeskRevitAddinFolderPath);     

        }

        private void _timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            Update();
        }

        private void WriteErrorLog(Exception ex)
        {
            StreamWriter sw = null;

            try
            {
                sw = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "\\Logfile.txt", true);
                sw.WriteLine(DateTime.Now.ToString() + " ; " + ex.Source.ToString().Trim() + "; " + ex.Message.ToString().Trim());
                sw.Flush();
                sw.Close();

            }
            catch
            {

            }
        }

        protected override void OnStop()
        {
        }

    }

RevidAddinController.cs

    public static class RevidAddinController
    {

        public static IEnumerable<AddinStatus> Update_AutodeskAddinFolder_With_ArchcorpUpdatedAddinFiles(List<string> autoDeskVersion, string addinInstallationPath)
        {
            var networkDrive = ActivateNetworkDrive();
            var allAutodeskVersionPath = Util.GetAllAutodeskAddinLibraryFolderPaths(autoDeskVersion, addinInstallationPath);

            List<FileData> latestArchcorpAddins = new List<FileData>();

            foreach (var autodeskAddinFolder in allAutodeskVersionPath)
            {
                var archorpAddinFiles = Util.GetAllExternalRevitAddinFilesFromArchcorpAddinFolderPath(Configuration.ArchcorpAddinFolderPath);
                var autodeskAddinFiles = Util.GetAllExternalRevitAddinFilesLocationFromAutodeskAddinFolderPath(autodeskAddinFolder);

                var latestAddins = Util.GetUpdatedRevitAddinFromArchcorpFolderPath(autodeskAddinFolder, archorpAddinFiles, autodeskAddinFiles)
                                       .Where(addin => !addin.FileName.Contains(Configuration.DeleteAddinNamePrefix));

                latestArchcorpAddins.AddRange(latestAddins);
            }

            List<AddinStatus> addinCopyStatus = new List<AddinStatus>();
            foreach (var autodeskAddinPath in allAutodeskVersionPath)
            {
                foreach (var newArchcorpAddin in latestArchcorpAddins)
                {
                    addinCopyStatus.Add(Util.InstallNewAddinFile(newArchcorpAddin, autodeskAddinPath));
                }
            }

            return addinCopyStatus;
        }


    /// <summary>
    /// Map the network drive path
    /// </summary>
    /// <returns></returns>
    public static NetworkDrive ActivateNetworkDrive()
    {
        NetworkDrive oNetDrive = new aejw.Network.NetworkDrive();
        try
        {
            oNetDrive.LocalDrive = "O:";
            oNetDrive.ShareName = @"\\acdxbfs1\Organisation";
            oNetDrive.Force = true;
            oNetDrive.Persistent = true;
            oNetDrive.MapDrive();
        }
        catch (Exception err)
        {
            throw err;
        }
        return oNetDrive;
    }

    }

可以在此处要点上找到完整的代码。 如果有人审查代码并为此问题提供任何反馈/解决方案,我们将不胜感激。

在默认的“ 本地系统帐户”下运行服务将没有共享的概念。 这些是在用户帐户下设置的。

您的2个选择

  1. 在已映射这些共享的用户帐户下运行服务
  2. 通过和IP地址而不是驱动器号访问您的共享。 但是,您将需要相应地设置文件/文件夹权限。

该服务确实以本地系统(如先前的名称)运行。 如果将映射的网络驱动器映射到本地驱动器号,则该服务无法使用它(因为映射的网络驱动器始终仅针对用户上下文而不是整个计算机/系统进行映射)。 但是,该服务可以通过UNC \\\\ server \\ share访问共享。 如果您只有映射的网络驱动器,则可以在命令提示符下键入“ net use”来查看UNC路径。

如果您以用户身份运行程序,则Windows会自动在远程共享上对您进行身份验证(如果尚未通过添加映射的网络驱动器进行身份验证)。 因此,本地系统是您需要将目标共享的访问权限设置为计算机名的计算机帐户,例如,computer1 $(仅在域内可用,因为工作组不知道其他计算机)。 必须对文件权限和共享权限执行此操作,因为它们是独立的,并且可能限制您的访问权限。

另外,您也可以使用用户名和密码在远程网络共享处进行身份验证-stackoverflow中有一个出色的线程,您可以在此处找到它确实显示了如何实现此目的。

当然,您也可以在有权访问共享的服务管理器中将服务设置为用户/密码(services.msc-双击服务并转到登录选项卡)。 这样,将向用户授予“登录即服务”权限,这是必要的。

如果网络文件与本地系统帐户共享,则您需要以“本地系统帐户”身份登录,

作为“本地系统帐户”运行服务的优势在于该服务可以完全不受限制地访问本地资源。
但也有一些缺点,如要小心不要安装未经授权的服务,因为服务可以完全不受限制地访问。 而且如果服务有一些错误,那么可能会导致性能问题。

本地系统帐户选项

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM