Служба Windows с NLog

Я создаю службу Windows, с которой хочу использовать NLog. Я хочу, чтобы журналы записывались в место установки службы и говорили что-то вроде:

PathToInstalledService\Logs\MyLog.txt

Это, конечно, потребует прав администратора. Итак, мой вопрос: при создании установки для службы какую учетную запись следует использовать в ServiceProcessInstaller. В настоящее время я использую LocalService, но эта учетная запись не имеет необходимого повышения прав.

Спасибо.


person James    schedule 14.10.2009    source источник


Ответы (1)


Во время установки вы должны изменить права доступа к каталогу «Журналы», чтобы ваша учетная запись службы могла записывать файлы. Используйте учетную запись с наименьшими привилегиями, необходимыми для выполнения функций службы, обычно это учетная запись NETWORK SERVICE.

Вы можете сделать это из класса установки в службе:

    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);
    }
person csharptest.net    schedule 14.10.2009
comment
Следует ли вызывать этот код при инициализации класса ProjectInstaller? - person James; 14.10.2009
comment
Я бы создал для этого класс утилиты установки и добавил бы в него установщик службы: msdn.microsoft.com/en-us/library/ - person csharptest.net; 14.10.2009
comment
Любая идея, как я могу получить путь к моей конкретной папке установки из класса Installer? - person James; 15.10.2009
comment
Это делает то, что мне нужно, я вызываю этот метод в событии OnAfterInstall моего пользовательского установщика. Однако на данный момент я жестко кодирую путь установки, если бы вы могли обновить свое решение, указав, как я могу программно получить каталог установки, что было бы идеально. - person James; 15.10.2009
comment
Просто используйте событие AfterInstall выше. Он должен быть членом класса Install или заменить this.Context на installer.Context. - person csharptest.net; 15.10.2009
comment
Спасибо, я играл с Context.Parameters, просто не был уверен, как называется тот, который я буду искать! я попробую - person James; 15.10.2009