gpt4 book ai didi

c# Windows 关闭过程异常

转载 作者:可可西里 更新时间:2023-11-01 10:12:42 24 4
gpt4 key购买 nike

我需要帮助解决一个简单但奇怪的问题。问题是从我的应用程序关闭并重新启动窗口。我知道这很简单,网上有很多例子,但事情就是这样。通过这些方法(如 process.start() 或 win api 或 managmentobject)执行的关闭/重新启动与单击 Windows 关闭或重新启动按钮完成的关闭/重新启动不同。怎么办?

好的,我为学校实验室制作了一个客户端应用程序,它可以帮助教师通过屏幕截图和其他功能(如关机、重启、锁定等)监控学生在桌面上的事件。如果我从我的应用程序关闭/重启电脑,学生电脑在学生登录之前,Windows 启动屏幕不会显示在教师计算机上。但是如果我从学生计算机上的 Windows 菜单执行关机或重新启动,那么学生计算机启动屏幕将显示在教师计算机上。

我知道由我的应用程序启动的关机/重启会完全关闭/重启学生电脑,而 Windows 关机/重启会执行某种混合类型的操作,以某种方式保存用户 session 。并传递给下一个创业公司。

我想知道如何编写可以复制此行为以关闭或重新启动的代码。(“某种混合类型的东西,用户 session 以某种方式保存。并传递给下一次启动”)。另外/hybrid 不起作用。

客户端应用程序是一个 wpf 应用程序,它以提升的权限从任务计划程序运行,具有启动和登录任务。 wpf 应用程序最小化到系统托盘并使用 tcp 服务器托管 wcf 服务。

关机代码:

var psi = new ProcessStartInfo("shutdown", "/s /t 5");
psi.CreateNoWindow = true;
psi.UseShellExecute = false;
Process.Start(psi);

其他关机代码://来自:How to shut down the computer from C#

void Shutdown()
{
ManagementBaseObject mboShutdown = null;
ManagementClass mcWin32 = new ManagementClass("Win32_OperatingSystem");
mcWin32.Get();

// You can't shutdown without security privileges
mcWin32.Scope.Options.EnablePrivileges = true;
ManagementBaseObject mboShutdownParams =
mcWin32.GetMethodParameters("Win32Shutdown");

// Flag 1 means we want to shut down the system. Use "2" to reboot.
mboShutdownParams["Flags"] = "1";
mboShutdownParams["Reserved"] = "0";
foreach (ManagementObject manObj in mcWin32.GetInstances())
{
mboShutdown = manObj.InvokeMethod("Win32Shutdown",
mboShutdownParams, null);
}

另一个:来自:How to shut down the computer from C#

using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, Pack=1)]
internal struct TokPriv1Luid
{
public int Count;
public long Luid;
public int Attr;
}

[DllImport("kernel32.dll", ExactSpelling=true) ]
internal static extern IntPtr GetCurrentProcess();

[DllImport("advapi32.dll", ExactSpelling=true, SetLastError=true) ]
internal static extern bool OpenProcessToken( IntPtr h, int acc, ref IntPtr
phtok );

[DllImport("advapi32.dll", SetLastError=true) ]
internal static extern bool LookupPrivilegeValue( string host, string name,
ref long pluid );

[DllImport("advapi32.dll", ExactSpelling=true, SetLastError=true) ]
internal static extern bool AdjustTokenPrivileges( IntPtr htok, bool disall,
ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen );

[DllImport("user32.dll", ExactSpelling=true, SetLastError=true) ]
internal static extern bool ExitWindowsEx( int flg, int rea );

internal const int SE_PRIVILEGE_ENABLED = 0x00000002;
internal const int TOKEN_QUERY = 0x00000008;
internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
internal const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege";
internal const int EWX_LOGOFF = 0x00000000;
internal const int EWX_SHUTDOWN = 0x00000001;
internal const int EWX_REBOOT = 0x00000002;
internal const int EWX_FORCE = 0x00000004;
internal const int EWX_POWEROFF = 0x00000008;
internal const int EWX_FORCEIFHUNG = 0x00000010;

private void DoExitWin( int flg )
{
bool ok;
TokPriv1Luid tp;
IntPtr hproc = GetCurrentProcess();
IntPtr htok = IntPtr.Zero;
ok = OpenProcessToken( hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref
htok );
tp.Count = 1;
tp.Luid = 0;
tp.Attr = SE_PRIVILEGE_ENABLED;
ok = LookupPrivilegeValue( null, SE_SHUTDOWN_NAME, ref tp.Luid );
ok = AdjustTokenPrivileges( htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero
);
ok = ExitWindowsEx( flg, 0 );
}

最佳答案

好的人们....终于解决了。如果有人需要这个,就在这里。

如果您有一个在启动时由任务计划程序启动的应用程序,它只会在您单击 Windows 按钮重新启动或关闭时在启动时启动。这对我来说是个问题,因为我的应用程序需要在用户登录并开始将捕获的屏幕发送到教师 PC 之前启动。

我使用了 stackoverflow 和其他网站上提到的各种关机方法,它们有效但不像 Windows 关机和重启按钮的工作方式。

这是复制此行为的方法

如果您查看“shutdown”命令在命令提示符中采用的参数,它会提到:

/g : 完全关闭并重新启动计算机。系统重新启动后,重新启动所有已注册的应用程序。

/sg : 关闭计算机。在下次启动时,重新启动任何已注册的应用程序。

“重新启动任何已注册的应用程序”<- 这就是让它点击的原因...大声笑。

所以我使用了这段代码:

关机:

var psi = new ProcessStartInfo("shutdown", "/sg /t 0");
psi.CreateNoWindow = true;
psi.UseShellExecute = false;
Process.Start(psi);

重启:

var psi = new ProcessStartInfo("shutdown", "/g /t 0");
psi.CreateNoWindow = true;
psi.UseShellExecute = false;
Process.Start(psi);

任何应用程序都是任务调度程序,在启动期间以高权限运行,将在用户登录之前运行。Phew...

PS : 关机命令/sg 和/g 仅在最新版本的 Windows 中受支持。我可以确认它在 Windows 7 及更低版本中丢失。适用于 Windows 10。不知道 Windows 8 和 8.1。

关于c# Windows 关闭过程异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52403242/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com