Отцам ASP.Net : ExitWindowsEx did not work under Windows2003

vijrel7878

Написал код для рестрата виндов со странички asp.net, который прекрасно работает под XP, но не работает по Windows2003. Почему - не пойму
Может кто поможет разобраться?


protected static void ExitWindows(int how , bool force) {
EnableToken("SeShutdownPrivilege");
if (force)
how = how | EWX_FORCE;
long exit_code = ExitWindowsEx(how, 0);
if (exit_code == 0)
throw new PrivilegeException(FormatError(Marshal.GetLastWin32Error;
}

protected static void EnableToken(string privilege ) {
if (Environment.OSVersion.Platform != PlatformID.Win32NT || !CheckEntryPoint("advapi32.dll", "AdjustTokenPrivileges"
return;
IntPtr tokenHandle = IntPtr.Zero;
LUID privilegeLUID = new LUID;
TOKEN_PRIVILEGES newPrivileges = new TOKEN_PRIVILEGES;
TOKEN_PRIVILEGES tokenPrivileges ;
if (OpenProcessToken(Process.GetCurrentProcess.Handle, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref tokenHandle) == 0)
throw new PrivilegeException(FormatError(Marshal.GetLastWin32Error;
if (LookupPrivilegeValue("", privilege, ref privilegeLUID) == 0)
throw new PrivilegeException(FormatError(Marshal.GetLastWin32Error;
tokenPrivileges.PrivilegeCount = 1;
tokenPrivileges.Privileges.Attributes = SE_PRIVILEGE_ENABLED;
tokenPrivileges.Privileges.pLuid = privilegeLUID;
int size = 4;
if (AdjustTokenPrivileges(tokenHandle, 0, ref tokenPrivileges, 4 + (12 * tokenPrivileges.PrivilegeCount ref newPrivileges, ref size) == 0)
throw new PrivilegeException(FormatError(Marshal.GetLastWin32Error;
}


вызывается это дело как
ExitWindows(RestartOptions.Reboot, true);
при этом
Reboot = 2;
EWX_FORCE = 4;

ф-я импортится так:

[ DllImport( "user32.dll", EntryPoint="ExitWindowsEx", CharSet=CharSet.Ansi )]
private static extern int ExitWindowsEx(int uFlags, int dwReserved);


a_tischkevich

Можно вопрос? Нахуя в твоей программе много раз написано вот это:
throw new PrivilegeException(FormatError(Marshal.GetLastWin32Error;
если благодаря ему ничего понять нельзя?

Dasar

Что значит не работает?
Если этот код, например, выполнить из консольного приложения, то он работает?
ps
Правильно ли я помню, что на Win2003 крутится IIS 6.0, а на Xp - IIS 5.0?

vijrel7878

из консольного не пробовал. Выполняю из asp.net приложения. Вываливается exception при выполнениии ф-ции ExitWindowsEx, все остальное (в ф-ции EnableToken) отрабатывает нормально; При этом то же самое на windows xp прекрасно срабатывает, перегружая комп;
Да, на windows2003 iis6
Может в security policy подкрутить кчтонибудь нужно

bastii

а под каким юзером asp.net работает?

Dasar

У 6-го iis-а для asp.net-а сильно урезаны права для того, чтобы снизить опасность взлома.
Рекомендуется такие команды выносить в отдельный сервис, а не выполнять, напрямую, в asp.net-е.

vijrel7878

Network Service
Оставить комментарий
Имя или ник:
Комментарий: