先引用空间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)可怎么也关不了机..根本没有反应..谁帮我一下是什么原因??应该没有错了...

解决方案 »

  1.   

    bool CAutoShutDownDlg::ShutDown()
    {
    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++的代码  自己改吧
      

  2.   

    Windows 98可实现你的目的.
    Windows NT要关闭或重启系统,调用ExitWindowsEx的进程必须用AdjustTokenProvileges使SE_SHUTDOWN_NAME特权有效.
      

  3.   

    晕哟..什么又自称小妹...难道是小弟呀>>>本来女孩子干程序这一行比你们更难.再说我才开始. 我用的是C#的呀..我只要关机的功能,晚上不可能一天都坐在电脑面前守着它完成以后我再关机吧??.
    网上多是多,可都一个版本,都是这关键的几句.
      

  4.   

    请问xrl(xrl) 如何用AdjustTokenProvileges使SE_SHUTDOWN_NAME特权有效.
      

  5.   

    using System;
    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慢慢聊哈哈
      

  6.   

    本帖最后由 lxcnn 于 2010-10-08 07:40:21 编辑
      

  7.   

    用法: shutdown [-i | -l | -s | -r | -a] [-f] [-m \\computername] [-t xx] [-c "co 
    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!
      

  8.   

    总结一下:
      本人直接调用shutdown 命令关机很简单.不过我是问的为什么我这样写却关不了机.该怎么改才能运行成功. 谢谢各位前辈的指教. Top  
     syeerzy(快乐永远*先天下之乐而乐*后天下之忧而忧*)  你什么意思???? 我愿和任何人做朋友!我相信人之初,性本善.一天想得这么复杂干什么.简简单单快快乐乐过好每一天不是很好吗??
       结帐了...
      

  9.   

    best8625(07蓄势,08翱翔  有话直说.我不喜欢这样..不累嘛?? 
      

  10.   

    本帖最后由 lxcnn 于 2010-10-08 07:41:23 编辑
      

  11.   


    Set colOperatingSystems = GetObject("winmgmts:{(Shutdown)}").ExecQuery("Select * from Win32_OperatingSystem") 
    For Each objOperatingSystem in colOperatingSystems 
       ObjOperatingSystem.Win32Shutdown(8) 
    Next保存成vbs文件,用计划任务直接运行就可以了。想什么时候关都可以。
    条件是必须有vs环境。
      

  12.   

    纠正一下,刚才太想当然了,没有vs一样可以用.
    想在c#中使用这段代码做成dll文件就可以了.(又一次相当然)
      

  13.   

    代码都给你贴了 你Copy去编译下就OK了  还有问题么?
      

  14.   

    楼主大概没看明白“syeerzy(快乐永远*先天下之乐而乐*后天下之忧而忧*) ”的意思。
    嘿嘿。。他是借狼和羊的故事,借狼却死很惨,表达程序员无美女的无奈和悲哀。哈哈。。