Windows服务Process.Start不在网络服务帐户下工作

时间:2010-08-14 03:31:31

标签: c# windows windows-services process

编辑对于任何有问题的人来说,事实证明,这是一个需要解决的简单问题。密钥需要安装在服务帐户下。登录到服务帐户下的工作站,安装密钥,然后可以从将在服务帐户上下文下启动它的任何会话中运行它。问题解决了。

编辑:服务操作系统是Win 2003 编辑:启动notepad.exe时工作。让我相信它是在控制台应用程序中调用GnuPG的某个地方。

我有一个Windows服务,它充当将文件传入/传出网络的机制。对于其中一些进程,我想在传输发生之前或之后执行控制台应用程序。

我遇到一些问题,让控制台应用程序在网络服务帐户下正常运行。

以下是问题的布局:

Windows服务在网络服务帐户下运行,我们称之为Company\ServiceAccount Company\ServiceAccount想要运行Transfer ATransfer A需要在移动任何文件之前运行Console App AConsole App A还会弹出第三方控制台应用程序。 (原因是 - 我们希望在Console A中嵌入更多业务逻辑,而不是将该代码放在服务本身中)

Console App A调用一个免费的命令行PGP程序(任何想知道的人都会使用GnuPG)。 Console App A等待GnuPG完成并将一些文件移动到一个放置点,以便Transfer A可以拾取并移动它们。

应用程序代码在我在本地系统帐户下运行的工作站上运行正常。当Windows服务运行时,我不会从控制台应用程序获得任何反馈。我没有得到任何访问被拒绝的错误或其他任何东西,这无助于尝试调试它。

问题:

  1. 有没有明显的问题?服务帐户确实有效,连接到网络没有问题。
  2. 调用第三方程序时Console App A是否还需要在其Process.Start()命令中使用用户名/域/密码?
  3. 显然我可以选择其他方式,但是 - 我应该完全抛弃这个吗?我觉得它应该有用。
  4. 代码:

          System.Diagnostics.Process process = null;
            System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo(executable, args);
    
            string pwd = "mypassword"; //edited for security
            System.Security.SecureString securePwd = new System.Security.SecureString();
    
            foreach (char c in pwd)
                securePwd.AppendChar(c);
    
            try
            {
                psi.UseShellExecute = false;
                psi.WindowStyle = ProcessWindowStyle.Hidden;
                psi.CreateNoWindow = true;
                psi.ErrorDialog = false;
                psi.Password = securePwd;
                psi.UserName = "myserviceaccount"; //edited for security
                psi.Domain = "MyCompanyDomain"; //edited for security
                process = System.Diagnostics.Process.Start(psi);
                //Wait for the process to finish
                process.WaitForExit();
                process.Close();
            }
            catch (System.InvalidOperationException iox) { } //handle
            catch (System.ArgumentException ax) { } //handle
            catch (System.ComponentModel.Win32Exception wx) { } //handle 
            catch (System.IO.FileNotFoundException fnfx) { } //handle
    

2 个答案:

答案 0 :(得分:4)

对于任何有问题的人来说,事实证明,这是一个简单的问题需要解决。密钥需要安装在服务帐户下。登录到服务帐户下的工作站,安装密钥,然后可以从将在服务帐户上下文下启动它的任何会话中运行它。问题解决了。

答案 1 :(得分:0)

从Windows Vista服务开始,即使标记为交互式,也明确禁止与用户会话进行交互。见Interactive Services

  

重要服务不能直接   从Windows开始与用户交互   Vista系统。因此,技术   在标题为使用的部分中提到   互动服务不应该   用于新代码。

如果您的任何“控制台应用*”正在进行任何类型的用户互动,则会失败。情况可能如此吗?如果是,那么您不能从服务运行“控制台应用程序”,它们必须从用户会话启动。