您的位置:程序门 -> .net技术 -> c#



c# 自动关机代码为什么不能正常关机


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


c# 自动关机代码为什么不能正常关机[已结贴,结贴人:showhome]
发表于:2007-02-27 13:42:06 楼主
先引用空间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)可怎么也关不了机..根本没有反应..谁帮我一下是什么原因??应该没有错了...
发表于:2007-02-27 13:52:481楼 得分:0
代码没错
错再权限不够   需要先提权
发表于:2007-02-27 13:53:342楼 得分:0
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++的代码     自己改吧
发表于:2007-02-27 14:11:553楼 得分:0
谢谢大哥.不过小妹对c++不熟呀..先改着再说吧..有问题还请多多指教呀...
发表于:2007-02-27 14:14:254楼 得分:0
windows   98可实现你的目的.
windows   nt要关闭或重启系统,调用exitwindowsex的进程必须用adjusttokenprovileges使se_shutdown_name特权有效.
发表于:2007-02-27 14:38:175楼 得分:0
又自称小妹...
你到网上搜搜c#自动关机,我记得有代码的,直接抄
另外,这种功能何必用c#去写...
发表于:2007-02-27 14:48:066楼 得分:0
晕哟..什么又自称小妹...难道是小弟呀> > > 本来女孩子干程序这一行比你们更难.再说我才开始.

  我用的是c#的呀..我只要关机的功能,晚上不可能一天都坐在电脑面前守着它完成以后我再关机吧??.
网上多是多,可都一个版本,都是这关键的几句.
发表于:2007-02-27 15:00:217楼 得分:0
请问xrl(xrl)   如何用adjusttokenprovileges使se_shutdown_name特权有效.
发表于:2007-02-27 15:17:348楼 得分:18
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慢慢聊哈哈
发表于:2007-02-27 15:55:599楼 得分:0
嘿,,还不相信也..我的msn   cxcx530@126.com   加嘛..请多多指教..
发表于:2007-02-27 18:53:3710楼 得分:0
晕.....看见一起狼和羊的故事要上演了....   .....   感觉狼会死很惨....感觉而已
发表于:2007-02-27 18:58:4211楼 得分:0
本人号称好饮无量,好色无胆,末有什么
发表于:2007-02-27 20:26:5612楼 得分:0
权限问题吧?
发表于:2007-02-27 21:23:0613楼 得分:1
用法:   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!
发表于:2007-02-28 10:01:3714楼 得分:0
总结一下:
    本人直接调用shutdown   命令关机很简单.不过我是问的为什么我这样写却关不了机.该怎么改才能运行成功.   谢谢各位前辈的指教.   top    
  syeerzy(快乐永远*先天下之乐而乐*后天下之忧而忧*)     你什么意思????   我愿和任何人做朋友!我相信人之初,性本善.一天想得这么复杂干什么.简简单单快快乐乐过好每一天不是很好吗??
      结帐了...
发表于:2007-02-28 10:13:4315楼 得分:0
up
发表于:2007-02-28 10:14:0116楼 得分:0
不过做软件开发的mm都。。。。
发表于:2007-02-28 10:14:4417楼 得分:0
嘿嘿。。只是实说,jf啦,快给。。
发表于:2007-02-28 10:16:3018楼 得分:0
best8625(07蓄势,08翱翔     有话直说.我不喜欢这样..不累嘛??  

发表于:2007-02-28 10:17:0319楼 得分:0
生气了
发表于:2007-02-28 10:20:0320楼 得分:0
我等着mm节贴呢...
发表于:2007-02-28 10:24:1421楼 得分:0
生气.有必要吗??晕...对身体不好的..呵呵...结了..有意成为朋友了.加qq   165225804或是msn   都行..
发表于:2007-02-28 10:53:2622楼 得分:1

set   coloperatingsystems   =   getobject( "winmgmts:{(shutdown)} ").EXECquery( "select   *   from   win32_operatingsystem ")  
for   each   objoperatingsystem   in   coloperatingsystems  
      objoperatingsystem.win32shutdown(8)  
next

保存成vbs文件,用计划任务直接运行就可以了。想什么时候关都可以。
条件是必须有vs环境。
发表于:2007-02-28 11:14:2923楼 得分:0
纠正一下,刚才太想当然了,没有vs一样可以用.
想在c#中使用这段代码做成dll文件就可以了.(又一次相当然)
发表于:2007-02-28 11:23:1224楼 得分:0
中国的龙芯有救了~~
发表于:2007-02-28 12:49:2325楼 得分:0
实现关机有很多种方法,偶不是求一种来现实,我是问的我这种做法错在哪里?该怎么改才能正常运行,有人会吗??哎....
发表于:2007-02-28 12:56:5826楼 得分:0
代码都给你贴了   你copy去编译下就ok了     还有问题么?
发表于:2007-02-28 13:07:5727楼 得分:0
不说了.结了..
发表于:2007-03-01 09:24:1628楼 得分:0
呼呼     mark
发表于:2007-03-20 08:27:1229楼 得分:0
楼主大概没看明白“syeerzy(快乐永远*先天下之乐而乐*后天下之忧而忧*)   ”的意思。
嘿嘿。。

他是借狼和羊的故事,借狼却死很惨,表达程序员无美女的无奈和悲哀。哈哈。。
发表于:2007-03-29 17:04:5930楼 得分:0
美能当饭吃?我又不靠这个吃饭.长得那么漂亮干什么用.只要对得起观众就行.再说了.重庆是出美女的地方,再差也差多远吗???qq上有照片,看了不就知道了嘛..晕....
发表于:2007-09-17 04:00:1531楼 得分:0
mark


快速检索

最新资讯
热门点击