none
求助..关于ShutDownSystem.... RRS feed

  • 问题

  • using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    
    namespace CSharp瞬间关机
    {
        public partial class Form1 : Form
        {
            [DllImport("advapi32.dll")]
             public static extern bool OpenProcessToken(IntPtr ProcessHandle, int access, ref IntPtr TokenHandle);
    
                [DllImport("advapi32.dll")]
                public static extern bool AdjustTokenPrivileges(IntPtr TokenHandle, bool Disable, ref TokenLuid NewState, int BufferLength, IntPtr PreviousState,IntPtr ReturnLength);
               
                public struct TokenLuid
                { public int Count;
                public long Luid;
                public int attr;
                }
              [DllImport("advapi32.dll")]
                public static extern  bool LookupPrivilegeValue(string lps,string lpn,ref long lpLuid);
    
              public const int SE_PRIVILEGE_ENABLED = 0x00000002;
              public const int TOKEN_QUERY = 0x00000008;
              public const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
              public string SE_SHUTDOWN_NAME = "SE_SHUTDOWN_PRIVILEGE";
    
              
               [DllImport("kernel32.dll")]
               public static extern IntPtr GetCurrentProcess();
    
    
    
               //Declare Function NtShutdownSystem& Lib "ntdll" (ByVal ShutdownAction As Int32)
    
               [DllImport("ntdll.dll")]
              private static extern void NtShutdownSystem(int ShutdownAction);
    
    
                const int SHUTDOWN = 0;
                const int POWEROFF = 2;
    
      public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                IntPtr a =IntPtr.Zero;
                IntPtr b = GetCurrentProcess();
                
                TokenLuid d;
                d.Count=1;
                d.Luid=0;
                d.attr=SE_PRIVILEGE_ENABLED;
               OpenProcessToken(b, TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, ref a);
                LookupPrivilegeValue(null,SE_SHUTDOWN_NAME, ref d.Luid);
                AdjustTokenPrivileges(a, false, ref d, 0, IntPtr.Zero, IntPtr.Zero);
                }
    
            private void button1_Click(object sender, EventArgs e)
            {
                NtShutdownSystem(2);
                
            }
    
            
        }
    }
    
    就是不行..提权貌似没有问题啊...

    Visual Basic 初学者 望关照!

    2012年8月24日 15:49

答案

  • 下断点。。调试一下就知道什么原因了。。

    另外,那几个导入的函数,他们都是有返回值的。。应该判断一下返回值;如果有必须要可以检查一下 GetLastError()。。

    应该很容易找到问题的。。


    学习学习....

    2012年8月30日 3:19
  • 放一个 Marshal.GetLastWin32Error 看看三个 P/Invoke 有没有报错。感觉上像是没有权限。


    Mark Zhou

    2012年8月30日 5:18
  • 你提权也只能调用用户模式的ExitWindows去关闭Windows(抱歉具体的API可能不叫这名)

    不要直接调用系统内核函数, 因为可能会要求更高的权限, 比如SYSTEM


    喜欢C#,喜欢看上去很酷、或者用起来很有用、或者很高效的代码

    2012年9月3日 1:01

全部回复

  • 怎么个不行法呢?

    可以给大家提供一些详细信息么?是有error出现还是什么?

    抱歉,今天我Visual Studio出问题了,还没有能跑一下你给的代码。

    2012年8月28日 9:31
  • 就是没有反应..

    Visual Basic 初学者 望关照!

    2012年8月29日 12:57
  • 下断点。。调试一下就知道什么原因了。。

    另外,那几个导入的函数,他们都是有返回值的。。应该判断一下返回值;如果有必须要可以检查一下 GetLastError()。。

    应该很容易找到问题的。。


    学习学习....

    2012年8月30日 3:19
  • 放一个 Marshal.GetLastWin32Error 看看三个 P/Invoke 有没有报错。感觉上像是没有权限。


    Mark Zhou

    2012年8月30日 5:18
  • 你提权也只能调用用户模式的ExitWindows去关闭Windows(抱歉具体的API可能不叫这名)

    不要直接调用系统内核函数, 因为可能会要求更高的权限, 比如SYSTEM


    喜欢C#,喜欢看上去很酷、或者用起来很有用、或者很高效的代码

    2012年9月3日 1:01
  • 不对,这个权限在VB.NET中是好使的。

    Visual Basic 初学者 望关照!

    2012年9月7日 16:20
  • 那东西咋用...

    Visual Basic 初学者 望关照!

    2012年9月7日 16:23