先引用空间using System.Runtime.InteropServices ;
再申明
[ DllImport("user32") ]
public static extern long ExitWindowsEx(long uFlags, long dwReserved ) ;定义常量
long dwReserved ;
const int SHUTDOWN = 1 ;
const int REBOOT = 2 ;
long sh ;
关机时调用sh=ExitWindowsEx(SHUTDOWN, dwReserved)可怎么也关不了机..根本没有反应..谁帮我一下是什么原因??应该没有错了...
再申明
[ DllImport("user32") ]
public static extern long ExitWindowsEx(long uFlags, long dwReserved ) ;定义常量
long dwReserved ;
const int SHUTDOWN = 1 ;
const int REBOOT = 2 ;
long sh ;
关机时调用sh=ExitWindowsEx(SHUTDOWN, dwReserved)可怎么也关不了机..根本没有反应..谁帮我一下是什么原因??应该没有错了...
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp; if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return false; 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); if (GetLastError() != ERROR_SUCCESS)
return false; switch(m_Radio)
{
case 0:
if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0))
return false;
break;
case 1:
if(!ExitWindowsEx(EWX_REBOOT | EWX_FORCE,0))
return false;
break;
case 2:
if(!ExitWindowsEx(EWX_LOGOFF | EWX_FORCE,0))
return false;
break;
}
return true;
}
c++的代码 自己改吧
Windows NT要关闭或重启系统,调用ExitWindowsEx的进程必须用AdjustTokenProvileges使SE_SHUTDOWN_NAME特权有效.
网上多是多,可都一个版本,都是这关键的几句.
using System.Runtime.InteropServices;
class shoutdown{
[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 static 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 );
} public static void Main()
{
Console.WriteLine("正在关机……");
// 修改 EWX_SHUTDOWN 或者 EWX_LOGOFF, EWX_REBOOT等实现不同得功能。
// 在XP下可以看到帮助信息,以得到不同得参数
// SHUTDOWN /?
DoExitWin(EWX_SHUTDOWN);
}
}直接用吧
果真女子的话,加我MSN慢慢聊哈哈
mment"] [-d up:xx:yy] 没有参数 显示此消息(与 ? 相同)
-i 显示 GUI 界面,必须是第一个选项
-l 注销(不能与选项 -m 一起使用)
-s 关闭此计算机
-r 关闭并重启动此计算机
-a 放弃系统关机
-m \\computername 远程计算机关机/重启动/放弃
-t xx 设置关闭的超时为 xx 秒
-c "comment" 关闭注释(最大 127 个字符)
-f 强制运行的应用程序关闭而没有警告
-d [u][p]:xx:yy 关闭原因代码
u 是用户代码
p 是一个计划的关闭代码
xx 是一个主要原因代码(小于 256 的正整数)
yy 是一个次要原因代码(小于 65536 的正整数)直接调用shutdown 命令关机简单1!
本人直接调用shutdown 命令关机很简单.不过我是问的为什么我这样写却关不了机.该怎么改才能运行成功. 谢谢各位前辈的指教. Top
syeerzy(快乐永远*先天下之乐而乐*后天下之忧而忧*) 你什么意思???? 我愿和任何人做朋友!我相信人之初,性本善.一天想得这么复杂干什么.简简单单快快乐乐过好每一天不是很好吗??
结帐了...
Set colOperatingSystems = GetObject("winmgmts:{(Shutdown)}").ExecQuery("Select * from Win32_OperatingSystem")
For Each objOperatingSystem in colOperatingSystems
ObjOperatingSystem.Win32Shutdown(8)
Next保存成vbs文件,用计划任务直接运行就可以了。想什么时候关都可以。
条件是必须有vs环境。
想在c#中使用这段代码做成dll文件就可以了.(又一次相当然)
嘿嘿。。他是借狼和羊的故事,借狼却死很惨,表达程序员无美女的无奈和悲哀。哈哈。。