unit mainunit;
{远程关机源码}
interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, StrUtils; type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
RadioButton3: TRadioButton;
RadioButton4: TRadioButton;
Button1: TButton;
Button2: TButton;
Label1: TLabel;
RadioButton5: TRadioButton;
RadioButton6: TRadioButton;
GroupBox2: TGroupBox;
Label2: TLabel;
Edit1: TEdit;
Button3: TButton;
Label3: TLabel;
Label4: TLabel;
Edit2: TEdit;
Edit3: TEdit;
Label5: TLabel;
Edit4: TEdit;
Memo1: TMemo;
Label6: TLabel;
Button4: TButton;
Button5: TButton;
procedure FormShow(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
function GetWinVer: Byte;//获得当前操作系统的版本
function SetPrivilege(PrivilegeName: string; Enable: Boolean): Boolean;//设置系统权限
procedure ShutDownSystem(EWX_Type: Integer);//根据关机类型,执行操作
function ShutDownRemote(lpMachineName: PChar; lpUsr: PChar; lpPwd: PChar; lpMsg: PChar; dwTimeOut: DWORD): Integer;
end; var
Form1: TForm1; implementation {$R *.dfm}
const
EWX_FORCE= ;
EWX_LOGOFF= ;
EWX_SHUTDOWN= ;
EWX_REBOOT= ;
EWX_POWEROFF= ;
EWX_SLEEP= ; function TForm1.GetWinVer: Byte;
var
OS: TOSVersionInfo;
begin
OS.dwOSVersionInfoSize:= SizeOf(TOSVersionInfo);
GetVersionEx(OS);
case OS.dwPlatformId of
VER_PLATFORM_WIN32s : Result:= ;//Windows 3.1x/32s
VER_PLATFORM_WIN32_WINDOWS : Result:= ;//Windows 95
VER_PLATFORM_WIN32_NT : Result:= ;//Windows NT
else
Result := ;
end;
end; function TForm1.SetPrivilege(PrivilegeName: string; Enable: Boolean): Boolean;
var
NewState, PreviousState: TTokenPrivileges;
Token: THandle;
dwRetLen: DWORD;
begin
Result:= False;
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token);
NewState.PrivilegeCount:= ;
if(LookupPrivilegeValue(nil, PChar(PrivilegeName), NewState.Privileges[].Luid)) then
begin
if Enable then
NewState.Privileges[].Attributes:= SE_PRIVILEGE_ENABLED
else
NewState.Privileges[].Attributes:= ;
dwRetLen:= ;
Result:= AdjustTokenPrivileges(Token, False, NewState, SizeOf(PreviousState), PreviousState, dwRetLen);
end;
CloseHandle(token);
end; function TForm1.ShutDownRemote(lpMachineName: PChar; lpUsr: PChar; lpPwd: PChar; lpMsg: PChar; dwTimeOut: DWORD): Integer;
var
hToken: THandle;
nRet: Integer;
tp, tpNew: TOKEN_PRIVILEGES;
nr: _NETRESOURCE;
dwRetLen, dwResult: DWORD;
begin
nRet := -;
ZeroMemory(@nr, sizeof(nr));
nr.dwType := RESOURCETYPE_ANY;
nr.lpLocalName := '';
nr.lpProvider := '';
nr.lpRemoteName := lpMachineName;
dwResult := WNetAddConnection2(nr, lpPwd, lpUsr, )- ; if(dwResult = ) then
begin
if(OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)) then
begin
tp.PrivilegeCount := ;
if(not(LookupPrivilegeValue(lpMachineName,
'SeRemoteShutdownPrivilege', tp.Privileges[].Luid))) then
begin
nRet := -; // 查找远程关机权限失败
end
else
begin
tp.Privileges[].Attributes := SE_PRIVILEGE_ENABLED;
if(not(AdjustTokenPrivileges(
hToken, false, tp, SizeOf(tp), tpNew, dwRetLen))) then
begin
nRet := -; // 调整远程关机权限失败
end
else
begin
if(InitiateSystemShutdown(
lpMachineName, lpMsg, dwTimeOut, True, False)) then
nRet :=
else
nRet := -; // 远程关机执行失败
end;
end;
CloseHandle(hToken);
end;
end
else
nRet := -; // 连接到远程主机失败
Result := nRet;
end; procedure TForm1.ShutDownSystem(EWX_Type: Integer);
begin
if GetWinVer= then
begin
SetPrivilege('SeShutdownPrivilege', True);//提升权限到可以关机
if (not ExitWindowsEx(EWX_Type, )) then
SetPrivilege('SeShutdownPrivilege', False);//如果关机不成功,还将权限设置回去
end
else //如果内核是Win9x,或者其他,则直接调用API函数
ExitWindowsEx(EWX_Type, );
end; procedure TForm1.FormShow(Sender: TObject);
begin
RadioButton1.Checked:= True;
Button1.SetFocus;
end; procedure TForm1.FormCreate(Sender: TObject);
begin
if GetWinVer= then
Label1.Caption:= Label1.Caption + 'Windows NT'
else
Label1.Caption:= Label1.Caption + 'Windows 95/98'; Memo1.Text := '';
Edit1.Text := '192.168.135.123';
Edit2.Text := 'Administrator';
Edit4.Text := ''; AnimateWindow(Handle, , AW_CENTER);
end; procedure TForm1.Button2Click(Sender: TObject);
begin
Close;
end; procedure TForm1.Button1Click(Sender: TObject);
begin
if(Application.MessageBox('Do you decide to Execute?', 'System Warning', MB_OKCANCEL + MB_OK)= IDOK) then
begin
if (RadioButton1.Checked) then
ShutDownSystem(EWX_SHUTDOWN)
else if (RadioButton2.Checked) then
ShutDownSystem(EWX_REBOOT)
else if (RadioButton3.Checked) then
ShutDownSystem(EWX_LOGOFF)
else if (RadioButton4.Checked) then
ShutDownSystem(EWX_POWEROFF)
else if (RadioButton5.Checked) then
ShutDownSystem(EWX_FORCE)
else if (RadioButton6.Checked) then
ShutDownSystem(EWX_FORCEIFHUNG);
end;
end; procedure TForm1.Button3Click(Sender: TObject);
var
strMsg, strCpt: string;
dwTimeOut: DWORD;
nRet: Integer;
unIcon: UINT;
begin
if (Edit1.Text = '') or (Edit2.Text = '') then
MessageBox(Handle, 'Input ComputerIP and UserName', 'System Warning',
MB_OK + MB_ICONWARNING); if Edit1.Text[] <> '\' then
strCpt := '\\' + Edit1.Text; try
begin
dwTimeOut := StrToInt(Edit4.Text);
end;
except
begin
dwTimeOut := ;
end;
end; nRet := ShutDownRemote(PChar(Edit1.Text), PChar(Edit2.Text), PChar(Edit3.Text),
PChar(Memo1.Text), dwTimeOut);
unIcon := MB_ICONWARNING;
case nRet of
:
begin
strMsg := 'Shut' + strCpt + ' Successfully';
unIcon := MB_ICONINFORMATION;
end;
-: strMsg := 'Search' + strCpt + ' Failed';
-: strMsg := 'Adjust' + strCpt + ' Failed';
-: strMsg := 'Shut' + strCpt + ' Failed';
-: strMsg := 'Connect' + strCpt + ' Failed';
else
strMsg := 'Connect to ' + strCpt + 'faild' + # + 'Maybe Can not find the IP';
//SysErrorMessage(nRet);
end;
MessageBox(Handle, PChar(strMsg), 'System FeedBack', MB_OK + unIcon);
end; procedure TForm1.Button4Click(Sender: TObject);
var
strCpt: string;
begin
if Edit1.Text[] <> '\' then
strCpt := '\\' + Edit1.Text;
if AbortSystemShutdown(PChar(strCpt)) then
MessageBox(Handle, 'Abort Shut System successfully', 'System FeedBack', MB_OK+MB_ICONINFORMATION)
else
MessageBox(Handle, 'Abort Shut System failed', 'System FeedBack', MB_OK+MB_ICONWARNING);
end; procedure TForm1.Button5Click(Sender: TObject);
begin
Close;
end; end.

delphi控制本计算机和远程计算机关机等的更多相关文章

  1. c# Start/Stop/Check Status远程计算机的Windows Service

    static void Main(string[] args) { ConnectionOptions op = new ConnectionOptions(); // 登陆远程计算机的远程, op. ...

  2. ubuntu下唤醒或休眠远程计算机

    ubuntu让我明白,没有什么完美的东西,要想完美必须付出代价.要么花时间折腾,要么花时间赚钱买系统. 人生也是一样,所以不要期待什么完美.哪有那么好的人,在合适的时间合适的地点让你遇见,还对你有感觉 ...

  3. [原创]用windows7连接windows2003的终端服务器时,出现"由于这台计算机没有远程桌面客户端访问许可证,远程会话被中断"的问题

    用windows7连接windows2003的终端服务器时,出现"由于这台计算机没有远程桌面客户端访问许可证,远程会话被中断"的问题,原因是终端服务器授权方式设置为了"每 ...

  4. ECS Win2008 远程时提示"要登录到此远程计算机,您必须被授予允许通过终端登录登录的权限"的解决方法

    问题描述 ECS Windows 2008 远程登陆时提示"要登录到此远程计算机,您必须被授予允许通过终端登录登录的权限",如下图所示: 问题分析 组策略中做了设置不允许管理员组成 ...

  5. Win7 远程桌面 错误代码:5 异常处理(您的远程桌面会话即将结束 此计算机的虚拟内存可能不足。请关闭其他程序,然后重试连接远程计算机。如果问题仍然存在,请联系网络管理员或技术支持。)

    问题表现: 在用windows7 远程桌面连接其他电脑时,出现错误提示对话框—-标题为“严重错误(错误代码:5)”,内容为“您的远程桌面会话即将结束 此计算机的虚拟内存可能不足.请关闭其他程序,然后重 ...

  6. win 10 远程连接出现 "由于安全设置错误, 客户端无法连接到远程计算机. 确定你已登录到网络后.” 错误

    win 10 远程连接出现 "由于安全设置错误, 客户端无法连接到远程计算机. 确定你已登录到网络后.” 错误 解决方法如下: Step 1:打开"本地安全策略"- Wi ...

  7. PC-如何提高计算机的启动和关机的速度?

    如何提高计算机的启动和关机的速度? 一.bios的优化设置 在bios设置的首页我们进入"advanced bios features"选项,将光标移到"frist bo ...

  8. (转)WS2008远程桌面连接时提示:“要登录到此远程计算机,您必须被授予允许通过终端服务登录的权限”的解决办法

    原文:http://www.chunfengxiyu.com/ws2008-mstsc-privilege.html WS2008远程桌面连接时提示:“要登录到此远程计算机,您必须被授予允许通过终端服 ...

  9. 关于win8.1“连接被远程计算机关闭”的一种解决方案

    我就是连接的时候出现"连接被远程计算机关闭",然后想着可能是win8更新之后网络协议 出问题了,后来无意中发现e信在第一次启动的时候会在网络适配器中会多出很多网卡,其中三个是带感叹 ...

随机推荐

  1. Kafka参数详解

    一.相关参数配置 System 系统参数 #唯一标识在集群中的ID,要求是正数. broker.id=0 #服务端口,默认9092 port=9092 #监听地址,不设为所有地址 host.name= ...

  2. U3D学习07-插值运算(位移与旋转)

    1.Lerp 线性插值计算.匀速移动 2.LerpAngle 线性插值计算.匀速旋转 3.MoveTowards  4.MoveTowardsAngel  5.SmoothStep非匀速移动  6.S ...

  3. layui之初始化加分页重复请求问题解决

    layui框架中的page困扰我很久,一个页面初始化后并且分页,导致初始化渲染请求一次,分页再请求了一次,一个接口就重复请求了2次,通过不停的分析和测试,最终解决了这个问题. 基于JQ的ajax二次封 ...

  4. keras训练和保存

    https://cloud.tencent.com/developer/article/1010815 8.更科学地模型训练与模型保存 filepath = 'model-ep{epoch:03d}- ...

  5. 使用Dotfuscator混淆你的.net程序

    简介 众所周知C#等net框架的程序是无法防止反编译的,但可以通过混淆,让反编译出来的代码非常难看. Dotfuscator是微软推荐使用的第三方混淆器,用来保护你的net程序.可以在安装VS的时候顺 ...

  6. 使用Mongo dump 将数据导入到hive

    概述:使用dump 方式将mongo数据导出,上传到hdfs,然后在hive中建立外部表. 1.     使用mongodump 将集合导出 mongodump --host=localhost:27 ...

  7. Json2:使用gson解析为List和Map

    import java.lang.reflect.Type; import java.util.List; import com.google.gson.Gson; import com.google ...

  8. hadoop分布式集群的搭建

    电脑如果是8G内存或者以下建议搭建3节点集群,如果是搭建5节点集群就要增加内存条了.当然实际开发中不会用虚拟机做,一些小公司刚刚起步的时候会采用云服务,因为开始数据量不大. 但随着数据量的增大才会考虑 ...

  9. 使用Redis数据库(String类型)

    一 String类型 首先使用启动服务器进程 : redis-server.exe 1. Set 设置Key对应的值为String 类型的value. 例子:向 Redis数据库中插入一条数据类型为S ...

  10. mysql-5.7.16-winx64解压版安装超详细图文教程

    1.安装: 将下载的mysql-5.7.16-winx64压缩包解压后的整个目录放在自己喜欢的位置,我的放在D盘根目录下 2.配置: 进入mysql-5.7.16-winx64目录,将里面的my-de ...