![](/img/trans.png)
[英]Windows Service getting access denied exception while writing to Network Drive
[英]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個選擇
該服務確實以本地系統(如先前的名稱)運行。 如果將映射的網絡驅動器映射到本地驅動器號,則該服務無法使用它(因為映射的網絡驅動器始終僅針對用戶上下文而不是整個計算機/系統進行映射)。 但是,該服務可以通過UNC \\\\ server \\ share訪問共享。 如果您只有映射的網絡驅動器,則可以在命令提示符下鍵入“ net use”來查看UNC路徑。
如果您以用戶身份運行程序,則Windows會自動在遠程共享上對您進行身份驗證(如果尚未通過添加映射的網絡驅動器進行身份驗證)。 因此,本地系統是您需要將目標共享的訪問權限設置為計算機名的計算機帳戶,例如,computer1 $(僅在域內可用,因為工作組不知道其他計算機)。 必須對文件權限和共享權限執行此操作,因為它們是獨立的,並且可能限制您的訪問權限。
另外,您也可以使用用戶名和密碼在遠程網絡共享處進行身份驗證-stackoverflow中有一個出色的線程,您可以在此處找到它確實顯示了如何實現此目的。
當然,您也可以在有權訪問共享的服務管理器中將服務設置為用戶/密碼(services.msc-雙擊服務並轉到登錄選項卡)。 這樣,將向用戶授予“登錄即服務”權限,這是必要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.