用户未登录时,Service中的ProcessStartInfo不起作用

时间:2016-10-10 08:49:52

标签: c# powershell

我有一个使用Topshelf用C#编写的Windows服务。

我想启动一个Powershell脚本,需要以管理员身份运行。

var workingDirectory = Path.GetDirectoryName(psScriptPath) ?? Environment.CurrentDirectory;

var process = new Process
{
    StartInfo = new ProcessStartInfo
    {
        FileName = @"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe",
        Arguments = string.Format("-ExecutionPolicy Bypass -File \"{0}\"", psScriptPath),
        WindowStyle = ProcessWindowStyle.Normal,
        WorkingDirectory = workingDirectory,
        Verb = runAsAdmin ? "runas" : null,
        UseShellExecute = true,
        CreateNoWindow = false
    }
};

process.Start();

该服务作为管理员帐户运行。

现在,这是奇怪的事情。当服务在一台全新的机器上运行时,我触发上面的代码没有任何反应。抛出没有例外,脚本似乎没有运行(它使用Powershell Transcript命令,并且没有创建日志文件)。

但是 - 如果我登录到计算机,并且触发了相同的代码,则代码会成功运行。

我已经尝试了我能想到的一切 - 文件权限,LoadUserProfile = true,禁用UAC(甚至在注册表中),似乎没有任何工作。我无法想到任何其他方法可以找到正在发生的事情,因为我无法登录机器。

任何想法?

1 个答案:

答案 0 :(得分:0)

除非设置了安全策略中的特定权限,否则服务无法创建交互式Windows。

这也是一种潜在的安全风险,因为服务设计并不是互动的。

您确定需要在交互式窗口中运行PS脚本吗?