Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Завершение работы


Автор: GX777 11.6.2008, 00:25
Вопрос №1:Как  завершить работу Windows?
Вопрос №2:Я делаю программу с ограниченным доступом.Посоветуйте,где мне хранить пароль,чтоб она его запоминала до последующео запуска? 

Автор: CYBERDREAM 11.6.2008, 06:43
Код

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Text;
namespace StartTurnOff
{
        public class WinAPIClass
        {
            
            #region Завершение работы Windows. 
            /// <summary>
            /// Завершение работы.
            /// </summary>
            /// <param name="shutDownType">Тип завершения работы.</param>
            /// <param name="reason">Причина</param>        
            /// <returns></returns>
            [DllImport("user32.dll")]
            public static extern bool ExitWindowsEx(uint shutDownType, string reason);

            //To shut down or restart the system, the calling process must use the 
            //AdjustTokenPrivileges function to enable the SE_SHUTDOWN_NAME privilege.
            // Для выключения или перезагрузки системы вызываемый процесс 
            //должен использовать функцию AdjustTokenPrivileges для получения 
            //определенного уровня доступа (привилегии)

            /// <summary>
            /// Тип завершения работы.
            /// </summary>
            public enum ShutdownType:int
            {
                LogOf = 0,
                Shutdown = 0x00000001,
                Reboot = 0x00000002,
                PowerOf = 0x00000008            
            }

            #endregion
            // Дополнительные переменные
            public const int SE_PRIVILEGE_ENABLED = 2;
            public const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege";
            public const int ANYSIZE_ARRAY = 1;
            public const int TOKEN_QUERY = 8;
            public const int TOKEN_ADJUST_PRIVILEGES = 32;//0x00000020;


            
            // Структура, используемая  для передачи в метод AdjustTokenPrivileges
            //  в качестве необходимой привилегии.
            [StructLayout(LayoutKind.Sequential, Pack=1)]
            internal struct TokPriv1Luid
            {
                // Количество привилегий в наборе.
                public int Count;
                public long Luid;
                // Тип привилегии.
                public int Attr;
            }

            /// <summary>
            /// Возвращение указателя на текущий процесс.
            /// </summary>
            /// <returns></returns>
            [DllImport("kernel32.dll", ExactSpelling=true) ]
            internal static extern IntPtr GetCurrentProcess();
            /// <summary>
            /// Открывание процесса  access token, который содержит информацию о 
///безопасности текущего пользователя, 
            /// привязанного  к заданному процессу.
            /// </summary>
            /// <param name="h">Указатель на процесс.</param>
            /// <param name="acc">Тип access token.</param>
            /// <param name="phtok">Указатель на access token.</param>
            /// <returns></returns>
            [DllImport("advapi32.dll", ExactSpelling=true) ]
            internal static extern bool OpenProcessToken( IntPtr h, int acc, ref IntPtr phtok );
            /// <summary>
            /// Возвращение значения переменной в текущей сессии ОС.
            /// </summary>
            /// <param name="host">Название системы. Если значение  null,  
            ///поиск осуществляется
            ///  в локальной системе.</param>
            /// <param name="name">Название переменной.</param>
            /// <param name="pluid">Указатель на значение переменной.</param>
            /// <returns></returns>
            [DllImport("advapi32.dll") ]
            internal static extern bool LookupPrivilegeValue( string host, string name, ref long pluid );
            /// <summary>
            /// Включение  указанной привилегии.
            /// </summary>
            /// <param name="htok">Указатель на access token</param>
            /// <param name="disall">Необходимость выключения  всех привилегий.</param>
            /// <param name="newst">Новое значение привилегии. Если предыдущее
            /// значение установлено в true, 
            /// то это значение не учитывается.</param>
            /// <param name="len">Размер буфера для следующего значения.</param>
            /// <param name="prev">Предыдущая привилегия.</param>
            /// <param name="relen">Указатель на  размер полученных привилегий.</param>
            /// <returns></returns>
            [DllImport("advapi32.dll", ExactSpelling=true) ]
            internal static extern bool AdjustTokenPrivileges( IntPtr htok, bool disall,
                ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen );
        }
    }
/////////////////////////////////////////
Обработка:
        private void btnUserOut_Click(object sender, System.EventArgs e)
        {
            WinAPIClass.ExitWindowsEx((uint)WinAPIClass.ShutdownType.LogOf, "Win Api test");
        }

        private void btnTurnOff_Click(object sender, System.EventArgs e)
        {
            RestartOrShotDown(WinAPIClass.ShutdownType.Shutdown);
        }
        
        private void btnRestart_Click(object sender, System.EventArgs e)
        {            
            RestartOrShotDown(WinAPIClass.ShutdownType.Reboot);
        }
        void RestartOrShotDown(WinAPIClass.ShutdownType type)
        {                
            WinAPIClass.TokPriv1Luid tp;
            IntPtr hproc = WinAPIClass.GetCurrentProcess();
            IntPtr hToken = IntPtr.Zero;
            WinAPIClass.OpenProcessToken( hproc, WinAPIClass.TOKEN_ADJUST_PRIVILEGES | WinAPIClass.TOKEN_QUERY, ref hToken );
            tp.Count = 1;
            tp.Luid = 0;
            tp.Attr = WinAPIClass.SE_PRIVILEGE_ENABLED;
            WinAPIClass.LookupPrivilegeValue(null, WinAPIClass.SE_SHUTDOWN_NAME, ref tp.Luid );
            WinAPIClass.AdjustTokenPrivileges(hToken, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero );
            WinAPIClass.ExitWindowsEx((uint)type, "Win Api test");

        }

        private void btnCancel2_Click(object sender, System.EventArgs e)
        {
            this.Close();
        }



Автор: Ram1reS 11.6.2008, 09:32
Цитата(GX777 @ 11.6.2008,  00:25)
Вопрос №1:Как  завершить работу Windows?
Вопрос №2:Я делаю программу с ограниченным доступом.Посоветуйте,где мне хранить пароль,чтоб она его запоминала до последующео запуска?

Можно просто выполнить "shutdown -s -t 1"  smile 

Автор: Azzdorf 12.6.2008, 08:16
Цитата(GX777 @ 11.6.2008,  00:25)
Вопрос №2:Я делаю программу с ограниченным доступом.Посоветуйте,где мне хранить пароль,чтоб она его запоминала до последующео запуска?

тебе нужно сохранить пароль или хэш пароля???

если что-бы в окошке просто светилось ************ - тогда сохрани в любом файлике нужное количество символов,

а вообще я для паролей (их хэшей  использую сюриализацию), про пароли было много тем и то где их хранить - поищи по форуму))))

если недопонял - пиши поподробнее)))  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)