Service starting a process wont show GUI C# 服务启动进程不会显示GUI C#

13 浏览
0 Comments

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谢谢。

0
0 Comments

问题:在服务启动进程时无法显示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)

0
0 Comments

问题出现的原因是服务以不同的用户身份运行,因此记事本由另一个用户在另一个桌面上运行,这就是为什么你看不到它。从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"应替换为当前用户的密码。请确保在使用此代码之前,已经了解了安全性和权限方面的注意事项,并以适当的方式使用它。

0
0 Comments

问题的原因是在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上的文章,您已经成功运行和调试了服务。非常感谢您的帮助!非常感谢!:)

0