Service starting a process wont show GUI C# 服务启动进程不会显示GUI C#
Service starting a process wont show GUI C# 服务启动进程不会显示GUI C#
嘿,我正在尝试使用一个服务来启动我的程序,但是没有显示GUI。进程已经启动,但是没有显示任何内容。我尝试了启用“允许服务与桌面交互”,但仍然没有起作用。\n我的程序是一个计算机锁定设备,用于阻止未经授权的用户访问计算机。我正在运行Windows 7,64位操作系统。\n这是我的服务的代码:\n
protected override void OnStart(string[] args) { Process p = new Process(); p.StartInfo.FileName = "notepad.exe"; p.Start(); FileStream fs = new FileStream(@"C:\Users\David\Documents\Visual Studio 2010\Projects\LockPCService\LockPCService\bin\Debug\ServiceLog.dj", FileMode.OpenOrCreate, FileAccess.Write); StreamWriter m_streamWriter = new StreamWriter(fs); m_streamWriter.BaseStream.Seek(0, SeekOrigin.End); m_streamWriter.WriteLine(" LockPCService: 服务已启动 " + DateTime.Now + "\n" + "\n"); m_streamWriter.Flush(); m_streamWriter.Close(); } protected override void OnStop() { FileStream fs = new FileStream(@"C:\Users\David\Documents\Visual Studio 2010\Projects\LockPCService\LockPCService\bin\Debug\ServiceLog.dj", FileMode.OpenOrCreate, FileAccess.Write); StreamWriter m_streamWriter = new StreamWriter(fs); m_streamWriter.BaseStream.Seek(0, SeekOrigin.End); m_streamWriter.WriteLine(" LockPCService: 服务已停止 " + DateTime.Now + "\n"); m_streamWriter.Flush(); m_streamWriter.Close(); }
\n为了尝试使服务工作,我使用了notepad.exe。当我查看进程时,notepad正在运行,但没有GUI。另外,每次运行时ServiceLog都在工作。\n为什么这不起作用呢?有什么建议吗?\n谢谢。
问题:在服务启动进程时无法显示GUI界面的问题。
原因:Windows操作系统的用户账户控制(UAC)机制限制了服务启动进程时显示GUI界面。
解决方法:使用"ApplicationLoader"类来启动进程并绕过UAC限制。
代码示例:
// 需要启动的应用程序名称 String applicationName = "cmd.exe"; // 启动应用程序 ApplicationLoader.PROCESS_INFORMATION procInfo; ApplicationLoader.StartProcessAndBypassUAC(applicationName, out procInfo);
注意:经测试,该方法在Windows 8和10操作系统中不起作用。
参考链接:[http://www.codeproject.com/Articles/35773/Subverting-Vista-UAC-in-Both-32-and-64-bit-Archite](http://www.codeproject.com/Articles/35773/Subverting-Vista-UAC-in-Both-32-and-64-bit-Archite)
问题出现的原因是服务以不同的用户身份运行,因此记事本由另一个用户在另一个桌面上运行,这就是为什么你看不到它。从Vista开始,“允许服务与桌面交互”不再支持。
你知道,我应该如何以当前用户的身份运行它呢?
即使以登录用户的帐户运行的服务也会在不同的登录会话中运行,并在独立的GUI环境中运行。你需要了解窗口站和桌面。 msdn.microsoft.com/en-us/library/ms681928.aspx
此外,虽然这是真实的,但并没有帮助解决问题,所以它应该是一个评论而不是一个答案。
解决方法是使用以下代码在C#中启动一个进程,并使其在当前用户的会话中显示GUI界面:
using System; using System.Diagnostics; using System.Security; public class ProcessStartExample { public static void Main() { Process process = new Process(); ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.FileName = "notepad.exe"; startInfo.RedirectStandardOutput = true; startInfo.UseShellExecute = false; startInfo.CreateNoWindow = true; startInfo.LoadUserProfile = true; startInfo.UserName = Environment.UserName; SecureString password = new SecureString(); foreach (char c in "password") { password.AppendChar(c); } startInfo.Password = password; process.StartInfo = startInfo; process.Start(); } }
请注意,代码中的"password"应替换为当前用户的密码。请确保在使用此代码之前,已经了解了安全性和权限方面的注意事项,并以适当的方式使用它。
问题的原因是在Windows Vista/7中,服务不允许创建用户界面。如果服务启动了另一个进程,该进程将在Session 0中运行,也不会显示任何用户界面。
解决方法是使用CodeProject上的文章,通过在用户桌面上创建进程并显示其用户界面来帮助解决该问题。
此外,建议在代码中使用"using"语句来包装流对象,以确保它们被正确释放。
对于此任务,最好不要使用用户桌面,因为您正在尝试阻止访问它。您可以在用户桌面上运行您的进程,然后通过钩子键盘和鼠标来阻止整个桌面,或者显示一个覆盖桌面的阻止窗口。SwitchDesktop仍然允许某人通过Ctrl+Alt+Del来终止服务。注入的进程可以禁用Ctrl+Alt+Del后的所有可用选项(实际上,服务可能也可以做到这一点)。
您无法禁用Ctrl+Alt+Del,但可以禁用或隐藏显示的选项。这些是注册表设置,您应该能够相对容易地找到它们。如果您想彻底做到这一点,考虑终止taskman.exe以及其他替代任务管理器(procexp.exe和procexp64.exe用于Process Explorer)。我可以说,我为我们公司的一个产品完成了所有这些工作,基本上是一个完整的桌面锁定,但我当然不能给您任何代码。
您可以在HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies中找到禁用Ctrl+Alt+Del后的有用选项。
如果您希望服务从文件中读取进程的路径,可以考虑使用App.config文件。另外,如果您必须使用单独的进程,请将其保留在当前目录中。
如果您将服务和主程序放在同一个文件夹中,并输入文件名,那么它应该可以工作。例如,"\\run.exe"。
最后,通过CodeProject上的文章,您已经成功运行和调试了服务。非常感谢您的帮助!非常感谢!:)