C# 使用NLog的Windows服务

C# 使用NLog的Windows服务,c#,windows-services,nlog,C#,Windows Services,Nlog,我正在创建一个要与NLog一起使用的Windows服务。我希望将日志写入服务的安装位置,例如: PathToInstalledService\Logs\MyLog.txt 这当然需要管理员权限。所以我的问题是,在为服务创建安装时,我应该在ServiceProcessInstaller上使用哪个帐户。我目前正在使用LocalService,但此帐户没有所需的提升 谢谢。在安装过程中,您应该更改“日志”目录的权限,以允许您的服务帐户写入文件。使用具有执行服务功能所需的最低权限的帐户,通常为网络服务

我正在创建一个要与NLog一起使用的Windows服务。我希望将日志写入服务的安装位置,例如:

PathToInstalledService\Logs\MyLog.txt
这当然需要管理员权限。所以我的问题是,在为服务创建安装时,我应该在ServiceProcessInstaller上使用哪个帐户。我目前正在使用LocalService,但此帐户没有所需的提升


谢谢。

在安装过程中,您应该更改“日志”目录的权限,以允许您的服务帐户写入文件。使用具有执行服务功能所需的最低权限的帐户,通常为网络服务帐户

您可以从服务上的安装类执行此操作:

    void Installer1_AfterInstall(object sender, InstallEventArgs e)
    {
        string myAssembly = Path.GetFullPath(this.Context.Parameters["assemblypath"]);
        string logPath = Path.Combine(Path.GetDirectoryName(myAssembly), "Logs");
        Directory.CreateDirectory(logPath);
        ReplacePermissions(logPath, WellKnownSidType.NetworkServiceSid, FileSystemRights.FullControl);
    }

    static void ReplacePermissions(string filepath, WellKnownSidType sidType, FileSystemRights allow)
    {
        FileSecurity sec = File.GetAccessControl(filepath);
        SecurityIdentifier sid = new SecurityIdentifier(sidType, null);
        sec.PurgeAccessRules(sid); //remove existing
        sec.AddAccessRule(new FileSystemAccessRule(sid, allow, AccessControlType.Allow));
        File.SetAccessControl(filepath, sec);
    }

是否应该在ProjectInstaller类初始化时调用此代码?我将为此创建一个install util类,并将服务安装程序添加到该类中:了解如何从installer类中获取特定安装文件夹的路径吗?这就是我需要的,我在自定义安装程序的OnAfterInstall事件中调用此方法。然而,目前我正在硬编码安装路径,如果您可以更新您的解决方案,我可以通过编程方式获得安装目录,这将是理想的。只需使用上面的AfterInstall事件。它应该是安装类的成员,或者将“this.Context”替换为“installer.Context”。