c# - 如何使用 'local system' 服务以域用户身份运行单独的进程?

原文 标签 c# process windows-services impersonation localsystem

我有以下简单的服务程序:

using System.Diagnostics;
using System.ServiceProcess;

namespace BasicService
{
    public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            ProcessStartInfo processStartInfo = new ProcessStartInfo
                                                    {
                                                        Verb = "runas",
                                                        UserName = "jdoe",
                                                        Password = "XXXXXXX".ConvertToSecureString(),
                                                        Domain = "abc.com",
                                                        UseShellExecute =false,
                                                        FileName = "notepad.exe"
                                                    };
            Process.Start(processStartInfo);
        }

        protected override void OnStop()
        {
        }
    }
}

我将它用作我的服务安装程序:
using System.ComponentModel;
using System.Configuration.Install;
using System.ServiceProcess;

namespace BasicService
{
    [RunInstaller(true)]
    public class ProjectInstaller : Installer
    {
        private readonly ServiceProcessInstaller _process;
        private readonly ServiceInstaller _service;

        public ProjectInstaller()
        {
            _process = new ServiceProcessInstaller {Account = ServiceAccount.LocalSystem};
            _service = new ServiceInstaller
                           {
                               ServiceName = "BasicService",
                               Description = "Just a testing service.",
                               StartType = ServiceStartMode.Automatic,
                           };

            Installers.Add(_process);
            Installers.Add(_service);
        }
    }
}

如果我在没有指定动词、用户名、密码、域和 useshellexecute 的情况下运行此服务,则一切都会运行。一旦我如上所示指定了这些值,我就会得到以下信息:

Service cannot be started. System.ComponentModel.Win32Exception (0x80004005): Access is denied at System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo) at System.Diagnostics.Process.Start() at System.Diagnostics.Process.Start(ProcessStartInfo startInfo) at BasicService.Service1.OnStart(String[] args) in C:\BasicService\BasicService\Service1.cs:line 24 at System.ServiceProcess.ServiceBase.ServiceQueuedMainCallback(Object state)



有任何想法吗?

最佳答案

从 Windows Vista 开始,服务不能简单地显示 ui 或与用户交互。
http://msdn.microsoft.com/en-us/library/ms683502(VS.85).aspx

因此,要从您的服务运行 GUI 应用程序,您需要使用 CreateProcessAsUser,它在 .NET 中不直接可用。所以你必须依赖 Pinvoke,有点类似于这里描述的

http://blogs.msdn.com/b/alejacma/archive/2007/12/20/how-to-call-createprocesswithlogonw-createprocessasuser-in-net.aspx

关于c# - 如何使用 'local system' 服务以域用户身份运行单独的进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9133105/

相关文章:

java - IEEE 754 和语言之间的值范围

javascript - 如何使用 Angular 的 $q promise 检索 HTTP 状态代码?

c# - 为什么从另一个类访问时静态int总是0

c# - 在任务栏中从 C# 应用程序聚焦 Windows 资源管理器

c++ - 用 Windows API 函数替换对 AfxGetInstanceHandle() 的调用

c# - Windows Service无法在其他平台上安装

c# - C# 中的全局变量替代方案?

c# - 从另一个进程获取 win32 线程的起始地址

c# - 安装Windows服务-没有错误,但不在Service Control Manager中

c# - 无法在 127.0.0.1 端口 555 上打开 TCP channel (SocketException : No Such Host Is Known)