编辑对于任何有问题的人来说,事实证明,这是一个需要解决的简单问题。密钥需要安装在服务帐户下。登录到服务帐户下的工作站,安装密钥,然后可以从将在服务帐户上下文下启动它的任何会话中运行它。问题解决了。
编辑:服务操作系统是Win 2003
编辑:启动notepad.exe时工作。让我相信它是在控制台应用程序中调用GnuPG的某个地方。
我有一个Windows服务,它充当将文件传入/传出网络的机制。对于其中一些进程,我想在传输发生之前或之后执行控制台应用程序。
我遇到一些问题,让控制台应用程序在网络服务帐户下正常运行。
以下是问题的布局:
Windows服务在网络服务帐户下运行,我们称之为Company\ServiceAccount
Company\ServiceAccount
想要运行Transfer A
。 Transfer A
需要在移动任何文件之前运行Console App A
。 Console App A
还会弹出第三方控制台应用程序。 (原因是 - 我们希望在Console A
中嵌入更多业务逻辑,而不是将该代码放在服务本身中)
Console App A
调用一个免费的命令行PGP程序(任何想知道的人都会使用GnuPG)。 Console App A
等待GnuPG完成并将一些文件移动到一个放置点,以便Transfer A
可以拾取并移动它们。
应用程序代码在我在本地系统帐户下运行的工作站上运行正常。当Windows服务运行时,我不会从控制台应用程序获得任何反馈。我没有得到任何访问被拒绝的错误或其他任何东西,这无助于尝试调试它。
问题:
Console App A
是否还需要在其Process.Start()
命令中使用用户名/域/密码?代码:
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
答案 0 :(得分:4)
对于任何有问题的人来说,事实证明,这是一个简单的问题需要解决。密钥需要安装在服务帐户下。登录到服务帐户下的工作站,安装密钥,然后可以从将在服务帐户上下文下启动它的任何会话中运行它。问题解决了。
答案 1 :(得分:0)
从Windows Vista服务开始,即使标记为交互式,也明确禁止与用户会话进行交互。见Interactive Services:
重要服务不能直接 从Windows开始与用户交互 Vista系统。因此,技术 在标题为使用的部分中提到 互动服务不应该 用于新代码。
如果您的任何“控制台应用*”正在进行任何类型的用户互动,则会失败。情况可能如此吗?如果是,那么您不能从服务运行“控制台应用程序”,它们必须从用户会话启动。