Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >使用 C# 自动化关闭电脑

使用 C# 自动化关闭电脑

作者头像
zls365
发布于 2021-04-23 04:46:08
发布于 2021-04-23 04:46:08
58500
代码可运行
举报
文章被收录于专栏:CSharp编程大全CSharp编程大全
运行总次数:0
代码可运行

咨询区

roomaroo

我查阅资料发现有一些可使用 C# 关闭用户电脑的方法,但我觉得都不是很简洁,所以我想在这里寻找一种简单或者使用原生 .NET 关闭的方式。

回答区

Pop Catalin

很简单,直接用 C# 调用 cmd 执行 shutdown 不就可以了吗? 我觉得这是最简单粗暴的做法,如下代码所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

Process.Start("shutdown","/s /t 0");

如果不想弹出 cmd 窗口,可以设置属性忽略掉。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

var psi = new ProcessStartInfo("shutdown","/s /t 0");

psi.CreateNoWindow = true;
psi.UseShellExecute = false;
Process.Start(psi);

当然你也可以通过 P/Invoke 或者 WMI 的方式调用 Win32 API 去搞定。

Ian R. O'Brien

这是我在学校时期写的比较粗糙的代码,主要就是用 C# 调用 Win32 API 中的 ExitWindowsEx 方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

using System.Runtime.InteropServices;

void Shutdown2()
{
    const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege";
    const short SE_PRIVILEGE_ENABLED = 2;
    const uint EWX_SHUTDOWN = 1;
    const short TOKEN_ADJUST_PRIVILEGES = 32;
    const short TOKEN_QUERY = 8;
    IntPtr hToken;
    TOKEN_PRIVILEGES tkp;

    // Get shutdown privileges...
    OpenProcessToken(Process.GetCurrentProcess().Handle, 
          TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, out hToken);
    tkp.PrivilegeCount = 1;
    tkp.Privileges.Attributes = SE_PRIVILEGE_ENABLED;
    LookupPrivilegeValue("", SE_SHUTDOWN_NAME, out tkp.Privileges.pLuid);
    AdjustTokenPrivileges(hToken, false, ref tkp, 0U, IntPtr.Zero, 
          IntPtr.Zero);

    // Now we have the privileges, shutdown Windows
    ExitWindowsEx(EWX_SHUTDOWN, 0);
}

// Structures needed for the API calls
private struct LUID
{
    public int LowPart;
    public int HighPart;
}
private struct LUID_AND_ATTRIBUTES
{
    public LUID pLuid;
    public int Attributes;
}
private struct TOKEN_PRIVILEGES
{
    public int PrivilegeCount;
    public LUID_AND_ATTRIBUTES Privileges;
}

[DllImport("advapi32.dll")]
static extern int OpenProcessToken(IntPtr ProcessHandle, 
                     int DesiredAccess, out IntPtr TokenHandle);

[DllImport("advapi32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool AdjustTokenPrivileges(IntPtr TokenHandle,
    [MarshalAs(UnmanagedType.Bool)]bool DisableAllPrivileges,
    ref TOKEN_PRIVILEGES NewState,
    UInt32 BufferLength,
    IntPtr PreviousState,
    IntPtr ReturnLength);

[DllImport("advapi32.dll")]
static extern int LookupPrivilegeValue(string lpSystemName, 
                       string lpName, out LUID lpLuid);

[DllImport("user32.dll", SetLastError = true)]
static extern int ExitWindowsEx(uint uFlags, uint dwReason);

在生产代码中,你应该检查这些 Win32 API 的返回值,这里我为了代码的简洁无视了这些判断。

点评区

哈哈,用C#操控电脑,这本身就是一个很有意思的东西,我感觉这套题目给了我很多的灵感,要学会擅长用 C# 操作 cmd ,刚好我前段时间给 apk 自动打包,就是用 C# 启动 cmd 调用 apktool 去给 apk 反向编译,为了就是把私有sqlite塞进去,然后再 正向编译 成apk,这不又让公司的服务提高了一个档次!???

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CSharp编程大全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
OpenProcessToken学习
  要对一个任意进程(包括系统安全进程和服务进程)进行指定了写相关的访问权的OpenProcess操作,只要当前进程具有SeDeDebug权限就可以了。要是一个用户是Administrator或是被给予了相应的权限,就可以具有该权限。可是,就算我们用Administrator帐号对一个系统安全进程执行OpenProcess(PROCESS_ALL_ACCESS,FALSE, dwProcessID)还是会遇到“访问拒绝”的错误。什么原因呢?原来在默认的情况下进程的一些访问权限是没有被使能(Enabled)的,所以我们要做的首先是使能这些权限。与此相关的一些API函数有OpenProcessToken、LookupPrivilegevalue、AdjustTokenPrivileges。我们要修改一个进程的访问令牌,首先要获得进程访问令牌的句柄,这可以通过OpenProcessToken得到,函数的原型如下:
全栈程序员站长
2022/09/07
3690
windowsAPI之OpenProcessToken,AdjustTokenPrivileges 和LookupPrivilegeValue
这三个函数主要用来提升进程的权限 1 OpenProcessToken()函数:获取进程的令牌句柄 OpenProcessToken的原型. BOOL WINAPI OpenProcessToken( __in HANDLE ProcessHandle, __in DWORD DesiredAccess, __out PHANDLE TokenHandle ); 第一个参数 进程句柄(当前进程为GetCurrentProcess()为参数) 第二个参数 访问令牌特权(可以参考msdnhttps://msdn.microsoft.com/zh-cn/library/aa374905) 第三个参数 令牌句柄 返回的参数 就是AdjustTokenPrivileges的第一个参数 2LookupPrivilegeValue()函数: 在认识这个函数之前我们需要了解一下结构体 TOKEN_PRIVILEGES结构体 typedef struct _TOKEN_PRIVILEGES { DWORD PrivilegeCount; LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY]; }TOKEN_PRIVILEGES; 第一个参数是个特权数组。 第二个参数是要修改的特权数目 LUID_AND_ATTRIBUTES 结构体 typedef struct _LUID_AND_ATTRIBUTES { LUID Luid; DWORD Attributes; } LUID_AND_ATTRIBUTES;
全栈程序员站长
2022/09/12
4350
c++实现远程开关机「建议收藏」
这两个功能的实现都需要事先对目标主机进行一些设置。其中远程开机需要目标主机主板支持,并且插上网线。部分主机的设置已经写明。另可实现方法:https://www.cnblogs.com/findumars/p/6009474.html
全栈程序员站长
2022/09/05
1K0
提升进程权限-OpenProcessToken等函数的用法[通俗易懂]
在枚举/结束系统进程或操作系统服务时,会出现自己权限不足而失败的情况,这时就需要提升自己进程到系统权限,其实提升权限的代码很简单的,看到过的最经典的应该是《WINDOWS核心编程》第四章中操作进程给出的那个函数了,如果我们真的不了解它的操作也不要紧,因为只要在你需要的地方调用下面这个函数就是了,以下是它的代码:
全栈程序员站长
2022/09/12
1.7K0
VB实现关机程序
大家好,又见面了,我是你们的朋友全栈君。下面是本人愿来写的关机程序可以适用于98/xp/2000,在程序中调用即可。现在操作系统多为2000或xp,所以需要特别注意的是应该先得到关机的特权:(要想弄懂下面的程序,先要具备vb调用api函数的知识……)
全栈程序员站长
2022/09/16
1K0
OpenProcessToken LookupPrivilegeValue 和AdjustTokenPrivilege[通俗易懂]
提升程序的特权,要用到三个函数: OpenProcessToken, AdjustTokenPrivileges, LookupPrivilegeValue
全栈程序员站长
2022/09/12
3970
OpenProcessToken 的操作
大家好,又见面了,我是你们的朋友全栈君。 OpenProcessToken 的操作
全栈程序员站长
2022/09/12
2300
实现Windows关机程序
void __fastcall TForm1::Button1Click(TObject *Sender) { HANDLE hToken; TOKEN_PRIVILEGES tkp; OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken); LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid); tkp.PrivilegeCount = 1; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, false, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
全栈程序员站长
2022/09/16
4370
病毒代码「建议收藏」
可以用来运行一下,你的电脑可能会发生……但大家都知道,病毒是恐怖的,你可以做一些有趣的代码.
全栈程序员站长
2022/09/06
4.5K0
安全关机程序[通俗易懂]
最近在实验室用ftp下点东西,但是由于实验室晚上12点就会断电。于是 需要在此之前关掉机器,图省事就用WindowsXP自带的计划任务每次设置 成11:50就调用“shutdown -s”命令自动关机。但是好几次都发现没法 正常关机,第二天早上起来就会检测磁盘。于是就做了个实验,发现确实 当使用flashfxp下载东西时,关机会不能正常关机,等待确定终止flashfxp 程序。
全栈程序员站长
2022/09/15
6530
浅析Windows Access Token以及利用方法
1 前置概念 关于Windows Access Token Windows Access Token(访问令牌),它是一个描述进程或者线程安全上下文的一个对象。每个用户登录计算机都会产生一个AcessToken以用于创建进程和线程,用户注销以后会将主令牌切换成模拟令牌,也就是授权令牌和模拟令牌,不会清除令牌,只有重启才会。 两种类型的Token Delegation token(授权令牌):用于交互会话登录(例如本地直接登录、rdp login 、psexec ) Impersonation token
FB客服
2023/03/30
1.3K0
浅析Windows Access Token以及利用方法
windows用户权限分配(进程权限)
if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken)) { TOKEN_PRIVILEGES tp; tp.PrivilegeCount = 1 ; ::LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&tp.Privileges[0].Luid); AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(tp),NULL,NULL);
全栈程序员站长
2022/07/28
2.8K0
Ring3挂起进程,跟恢复进程.
有时候我们做对抗的时候可能会遇到.一个进程常常操作我们.但是我们 可以通过挂起进程来挂起它让它无法操作.当然方法很多.不止这一种.
IBinary
2019/05/25
1.4K0
DLL注入
继续学习《逆向工程核心原理》,本篇笔记是第三部分:DLL注入,主要包括三种DLL注入、DLL卸载、修改PE、代码注入等内容
红客突击队
2022/09/29
1.8K0
DLL注入
全景AR增强监视系统对接SkeyeIVMS视频云管控系统实现软硬件资源的健康状态管理(二)
因此,我们首先需要一个无限获取状态的 Linux 守护进程 或 Windows 服务。
Openskeye
2023/04/03
3780
从Win服务启动UI程序
从windows服务启动一个带UI程序的界面,这个需求在xp中是很随意的,从Vista开始似乎没有那么随意了,因为Vista中加入了Session的概念,那么什么是Session,我想这篇文章介绍的应该比我权威的多。Session隔离介绍
用户1175783
2019/09/18
1.1K0
突破SESSION0隔离的远程线程注入
传统的远程线程技术一般是向普通用户进程注入线程。而要是想隐藏的更深,则需要突破SESSION0隔离机制,将自身进程注入到系统进程中,使得自己更加隐蔽。 突破SESSION0隔离的远程线程注入与传统的CreateRemoteThread实现DLL远程线程注入相比区别在与是用更为底层的ZwCreateEx函数来创建的。
YanXia
2023/04/07
4370
突破SESSION0隔离的远程线程注入
7.4 通过API枚举进程权限
GetTokenInformation 用于检索进程或线程的令牌(Token)信息。Token是一个数据结构,其包含有关进程或线程的安全上下文,代表当前用户或服务的安全标识符和权限信息。GetTokenInformation函数也可以用来获取这些安全信息,通常用于在运行时检查某个进程或线程的权限或安全信息。
王瑞MVP
2023/09/23
4240
C/C++ 提权与强制卸载DLL
权限提升 #include <Windows.h> #include <stdio.h> BOOL SetPrivilege(LPCTSTR lpszPrivilege, BOOL bEnablePrivilege) { TOKEN_PRIVILEGES tp; HANDLE hToken; LUID luid; OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken); Look
王瑞MVP
2022/12/28
3800
64位 & Windows 内核6
继续学习《逆向工程核心原理》,本篇笔记是第五部分:64位 & Windows 内核6
红客突击队
2022/09/29
6950
64位 & Windows 内核6
相关推荐
OpenProcessToken学习
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验