簡體   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