Автор: ruslrusl
Дата сообщения: 19.04.2010 08:02
v1rtyaluk
писал не сам, а нашел
Код:
using System.Runtime.InteropServices;
class reboot
{
//импортируем API функцию InitiateSystemShutdown
[DllImport("advapi32.dll", EntryPoint = "InitiateSystemShutdownEx")]
static extern int InitiateSystemShutdown(string lpMachineName, string lpMessage, int dwTimeout, bool bForceAppsClosed, bool bRebootAfterShutdown);
//импортируем API функцию AdjustTokenPrivileges
[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);
//импортируем API функцию GetCurrentProcess
[DllImport("kernel32.dll", ExactSpelling = true)]
internal static extern IntPtr GetCurrentProcess();
//импортируем API функцию OpenProcessToken
[DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
internal static extern bool OpenProcessToken(IntPtr h, int acc, ref IntPtr phtok);
//импортируем API функцию LookupPrivilegeValue
[DllImport("advapi32.dll", SetLastError = true)]
internal static extern bool LookupPrivilegeValue(string host, string name, ref long pluid);
//импортируем API функцию LockWorkStation
[DllImport("user32.dll", EntryPoint = "LockWorkStation")]
static extern bool LockWorkStation();
//объявляем структуру TokPriv1Luid для работы с привилегиями
[StructLayout(LayoutKind.Sequential, Pack = 1)]
internal struct TokPriv1Luid
{
public int Count;
public long Luid;
public int Attr;
}
//объявляем необходимые, для API функций, константые значения, согласно MSDN
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";
//функция SetPriv для повышения привилегий процесса
private void SetPriv()
{
TokPriv1Luid tkp; //экземпляр структуры TokPriv1Luid
IntPtr htok = IntPtr.Zero;
//открываем "интерфейс" доступа для своего процесса
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok))
{
//заполняем поля структуры
tkp.Count = 1;
tkp.Attr = SE_PRIVILEGE_ENABLED;
tkp.Luid = 0;
//получаем системный идентификатор необходимой нам привилегии
LookupPrivilegeValue(null, SE_SHUTDOWN_NAME, ref tkp.Luid);
//повышем привилигеию своему процессу
AdjustTokenPrivileges(htok, false, ref tkp, 0, IntPtr.Zero, IntPtr.Zero);
}
}
//публичный метод для перезагрузки/выключения машины
public int halt(bool RSh, bool Force)
{
SetPriv(); //получаем привилегия
//вызываем функцию InitiateSystemShutdown, передавая ей необходимые параметры
return InitiateSystemShutdown(null, null, 0, Force, RSh);
}
//публичный метод для блокировки операционной системы
public int Lock()
{
if (LockWorkStation())
return 1;
else
return 0;
}