首先,我不尝试与桌面进行任何形式的交互.我正在尝试做的是分开关注点.我有在本地系统帐户(LSA)下运行的服务.有时,我需要使用其他帐户执行流程.我为此使用System.Diagnostics.Process.到目前为止,这是我尝试过的:...
首先,我不尝试与桌面进行任何形式的交互.
我正在尝试做的是分开关注点.我有在本地系统帐户(LSA)下运行的服务.有时,我需要使用其他帐户执行流程.
我为此使用System.Diagnostics.Process.到目前为止,这是我尝试过的:
>将服务应用程序作为普通桌面应用程序运行,以相同的帐户启动子进程:
>将服务应用程序作为普通桌面应用程序运行,在另一个帐户下启动子进程:有效
>将服务作为服务应用程序运行(与LSA一样),以同一帐户(LSA)启动子进程:
>将服务作为服务应用程序运行(作为LSA),在另一个帐户下启动子进程:不起作用
对我不起作用的情况将引发Win32Exception,显示“访问被拒绝”.我已授予有问题的用户帐户作为服务登录的权利,但这没有任何区别.
为了娱乐,我还尝试了以下方案:
>如果我以自己的开发者帐户(称为开发者)运行服务,并尝试以特权较低的帐户(称为ServiceAccount)启动子进程,则process.Start()不会抛出并返回true,但我从没看到Sys Internal的Process Explorer中正在启动任何进程,并且Process.Exited立即被触发.
>如果我在ServiceAccount下运行该服务,并在同一帐户(ServiceAccount)下启动子进程,则它会按预期工作.
这是我正在使用的代码:
var pi = new ProcessStartInfo {
CreateNoWindow = true,
WindowStyle = ProcessWindowStyle.Hidden,
UseShellExecute = false,
ErrorDialog = false,
RedirectStandardError = false,
RedirectStandardInput = false,
RedirectStandardOutput = false,
FileName = @"C:\Path\To\SomeApplication.exe",
Arguments = @"Some arguments",
UserName = "SomeUserName",
Domain = "SomeDomain",
Password = SecureStringUtils.Convert("SomePassword")
};
var process = new Process();
process.StartInfo = pi;
process.Start(); // Throws when run as a service
有任何想法吗?
解决方法:
我终于找到了:Using Process.Start() to start a process as a different user from within a Windows Service,它解决了我的问题.诚然,答案中提供的代码需要大量改进,但这似乎可以解决我的问题.
本文标题为:c#-服务需要产生非交互式子进程,但会失败并显示“访问被拒绝”
基础教程推荐
- C#使用HttpWebRequest重定向方法详解 2023-01-22
- C# Winform实现复制文件显示进度 2023-06-27
- c#中task与thread的区别及使用讲解 2023-06-14
- C#结合SMTP实现邮件报警通知的实现示例 2023-03-09
- Unity实现场景漫游相机 2023-03-14
- C#8 的模式匹配实现 2023-02-03
- c# – 是否可以了解有关mongodb集合更改的信息? 2023-11-26
- C#实现多文件打包压缩(.Net Core) 2023-05-11
- Unity3D撤回命令开发详解 2023-01-16
- 详解C#如何利用爬虫技术实现快捷租房 2023-07-04