Форум: "WinAPI";
Текущий архив: 2004.06.06;
Скачать: [xml.tar.bz2];
ВнизПомогите разобраться с InitiateSystemShutdown Найти похожие ветки
← →
Pohil © (2004-03-24 00:19) [0]Уважаемые товарищи ! Помогите мне разобраться с этой наглой функцией. Вообщем мне нужно перезагрузить удаленный компьютер. В хэлпе по АПИ написано что - то вроде: "To shut down a remote computer, the calling process must have the SE_REMOTE_SHUTDOWN_NAME privilege on the remote computer." Только я не пойму как эти привилегии получить. И собственно функции AdjustTokenPrivileges передать SE_REMOTE_SHUTDOWN_NAME не получится. Надо вроде в winnt.h чего - то поглядеть. Короче помогите. Если есть то киньте на мыло winnt.h. Заранее благодарен.
Надеюсь не зря :)
← →
ALS © (2004-03-25 11:14) [1]Этот код всегда работал под NT4+SP6 и под W2000:
function Shutdown(Computer: PChar; Txt: PChar; Delay: integer; Reboot: boolean): boolean;
var hToken: THandle;
tkp: TTokenPrivileges;
ReturnLength: DWORD;
begin
Result := False;
// Get a token for this process.
if not OpenProcessToken(GetCurrentProcess,
TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
hToken) then exit;
// Get the LUID for the shutdown privilege.
if not LookupPrivilegeValue(Computer, "SeShutdownPrivilege",
tkp.Privileges[0].Luid) then exit;
tkp.PrivilegeCount := 1; // one privilege to set
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
// Get the shutdown privilege for this process.
if AdjustTokenPrivileges(hToken, FALSE, tkp, 0, nil, ReturnLength) then
Result := InitiateSystemShutdown(Computer, Txt, Delay, True, Bool(Reboot))
else
Application.MessageBox("Not enough privileges", "Error", MB_ICONSTOP)
end;
procedure TForm1.Button1Click(Sender: TObject);
var OldTime: cardinal;
begin
if ShutDown("Server", "Don""t worry, be happy!", 40, True) then
begin
OldTime := GetTickCount;
while GetTickCount - OldTime < 20000 do Application.ProcessMessages;
AbortSystemShutdown("Server")
end
end;
← →
Pohil © (2004-03-30 02:05) [2]Спасибо, конечно, за совет, особенно за код, но у меня было также и работало только с локальным IP. На другие IP ей было пофиг и ничего она с ними не делала. Вот так вот. :(
← →
Pohil © (2004-03-30 02:05) [3]Удалено модератором
Примечание: Дубль
← →
Игорь Шевченко © (2004-03-30 10:48) [4]Pohil © (30.03.04 02:05)
Ты хочешь перезагрузить компьютер не в локальной сети с помощью этой функции ?
← →
Pohil © (2004-04-05 11:54) [5]Как раз таки в локальной сети. Использую примерно такой код:
procedure TForm1.Button1Click(Sender: TObject);
var
hToken: THandle;
tkp: TTokenPrivileges;
ReturnLength: Cardinal;
begin
if OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
begin
LookupPrivilegeValue(nil, "SeShutdownPrivilege", tkp.Privileges[0].Luid);
tkp.PrivilegeCount := 1;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, False, tkp, 0, nil, ReturnLength);
LookupPrivilegeValue(nil, "SeRemoteShutdownPrivilege", tkp.Privileges[0].Luid);
tkp.PrivilegeCount := 1;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, False, tkp, 0, nil, ReturnLength);
InitiateSystemShutdown(PChar(edHost.Text), "He-he-he", 10, true, false);
end;
Gauge1.Progress := 0;
Timer1.Enabled := true;
end;
Код работает только для локального компьютера. Для любого другого InitiateSystemShutdown возвращает FALSE, ну и комп соответственно не перезагружается.
← →
Игорь Шевченко © (2004-04-05 12:23) [6]
> Для любого другого InitiateSystemShutdown возвращает FALSE
А GetLastError - это военная тайна, которую знать никому не положено.
TFM читай. Долго.
← →
Pohil © (2004-04-06 11:47) [7]Может для начала скажешь реально ли с помощью InitiateSystemShutdown перезагрузить комп в локалке?
Если да, то обязательно прочту TFM, особенно если расшифруешь.
А насколько я знаю GetLastError комп точно не перезагрузит.
← →
Игорь Шевченко © (2004-04-06 12:22) [8]Pohil © (06.04.04 11:47)
> реально ли с помощью InitiateSystemShutdown перезагрузить
> комп в локалке?
Можно вопрос: нафига ?
← →
S@shka © (2004-04-06 13:46) [9]Будет ли перезагрузка безоговорочной.
В частности ели какое то приложение ВИСИТ - приведет ли данный код к перезагрузке ПК?
← →
Pohil © (2004-04-06 23:28) [10]>Можно вопрос: нафига ?
Включи воображение. Представь огромный офис. 100 компов. Представь как админ в 19:00 начинает бегать и выключать все эти компы. Заканчивает в 20:00.
Слушай, помоги, пожалуйста, уже чем нибудь дельным, а то "TFM" - страшно даже становится. Очень надо. Если тебя ответ писать обламывает, может хоть ссылку кинь. Желательно на русский материал по вопросу. Но буду еще больше благодарен, если подскажешь чего в моем коде не правильно.
← →
Игорь Шевченко © (2004-04-07 00:11) [11]Pohil © (06.04.04 23:28)
> помоги, пожалуйста, уже чем нибудь дельным
То ли в системе, то ли в "потрепаться" был vb-script, делающий то, что тебе надо через WMI. Включи поиск.
> Для любого другого InitiateSystemShutdown возвращает FALSE
Читай справку. Для того, чтобы узнать, почему InitiateSystemShutdown вернула FALSE нужно вызвать GetLastError. То, что она вернет, проанализировать. Сказать ShowMessage(SysErrorMessage(GetLastError)). Текст запомнить и привести здесь.
← →
Pohil © (2004-04-07 13:33) [12]> 2Игорь Шевченко
Спасибо. Вот это действительно дельное. Попробую.
← →
Pohil © (2004-04-08 02:02) [13]>2Игорь Шевченко
Сделал как ты сказал. SysErrorMessage(GetLastError) возвратила: "Отказано в доступе", видимо программисты окон не утруждали себя подробным описанием ошибок. Ксати аналогичная ошибка возникала у меня при опросе сервисов, работающих на компе в LAN.
← →
Игорь Шевченко © (2004-04-08 10:27) [14]Pohil © (08.04.04 02:02)
Ну вот видишь, уже информация.
"By default, users can enable the SE_SHUTDOWN_NAME privilege on the computer they are logged onto, and administrators can enable the SE_REMOTE_SHUTDOWN_NAME privilege on remote computers. " -
это условие выполняется ? Есть ли у твоей учетной записи такая привилегия на удаленных компьютерах или в домене ?
"Common reasons for failure include an invalid or inaccessible computer name or insufficient privilege."
Еще совет: вызывай GetLastError после AdjustTokenPrivileges и сравнивай с ERROR_SUCCESS, если не сравнилось, выдавай ее значение, вышеописанным способом и говори здесь :)
← →
Pohil © (2004-04-08 11:39) [15]>2Игорь Шевченко
Честно говоря, я вообще н уверен, есть ли на удаленных компьютерах моя учетная запись. :)
Вариант 1.
Но допустим, что есть, как не вставая с места получить права именно на удаленной машине? AdjustTokenPrivileges по-моему сразу отпадает.
Вариант 2.
А если нет ее. Крайне не приятно получится. Встает 2 проблема: как, опять же, не вставая с места создать аккаунт для себя на удаленном компе.
>> Еще совет: вызывай GetLastError ....
Вызывал. Она говорит что все прекрасно и должно работать.
Еще вопрос: функция InitiateSystemShutdown всегда передает аккаунт под которым запускается?
← →
Игорь Шевченко © (2004-04-08 11:53) [16]" By default, users can enable the SE_SHUTDOWN_NAME privilege on the computer they are logged onto, and administrators can enable the SE_REMOTE_SHUTDOWN_NAME privilege on remote computers"
Кроме того, я не уверен, что все операциооные системы могут обработать вызов Remote Shutdown, просто не в курсе.
В локальной политике есть политика отвечающая за то, можно ли удаленно перезагрузить компьютер, можно и туда поглядеть.
← →
Pohil © (2004-04-08 22:17) [17]>2Игорь Шевченко
>Кроме того, я не уверен, что все операциооные системы...
Я тут глядел MSDN по этому поводу, и там сказано, что под XP это вполне возможно.
Прости, я повторюсь:
1.Как не вставая с места получить права именно на удаленной машине?
2.Как, опять же, не вставая с места создать аккаунт для себя на удаленном компе.
← →
Игорь Шевченко © (2004-04-08 23:17) [18]У тебя 100 компьютеров и все под XP ?
← →
Pohil © (2004-04-09 12:08) [19]> У тебя 100 компьютеров и все под XP ?
100 это ведь утрировано. Но 40 набереться, и XP, конечно, не на всех, но все таки преобладает. К тому же это не важно, даже если б 1 только был. Задача есть - требуется ее решить. Подскажи пожалуйста.
← →
Игорь Шевченко © (2004-04-09 13:26) [20]
> Честно говоря, я вообще н уверен, есть ли на удаленных компьютерах
> моя учетная запись. :)
Если удаленные компьютеры в домене и ты один из администраторов домена, то учетная запись есть. В контроллере домена.
Иначе это уже не администирование, а несколько иначе называется.
← →
Wistler © (2004-04-09 17:48) [21]А не судьба через Terminal выключить:
Подсоединится к удалённой машине и вызвать команду Shutdown
← →
WebErr © (2004-04-09 18:16) [22]
> Wistler © (09.04.04 17:48) [21]
Это как?
← →
Pohil © (2004-04-09 21:35) [23]> 2Wistler
Если ты имеешь ввиду сервер терминалов, то нет, не судьба. Дело в том что он выдает такую же ошибку, т.е. "Отказано в доступе". Да и, к тому же, интересно просто как это на делфе сделать.
← →
Wistler © (2004-04-10 13:48) [24]Через сокет, или есть компонента в D7, называется типа IWTerminal или что-то типо того. Избежать ошибки "Отказано в доступе" можно зарегестрировавшись под пользоывателем имеющим администраторские права.
У себя я так выключал компы.
← →
Pohil © (2004-04-10 14:15) [25]> 2Wistler
> можно зарегестрировавшись под пользоывателем имеющим администраторские права...
Можно поподробней на этом моменте. Я раньше не встречался с IWTerminal.
← →
Pohil © (2004-04-10 20:34) [26]> 2Wistler
Блин, я в D7 не могу найти IWTerminal. Где он там спрятан? И документации по нему нету.
Хеееееееееееееееееееееееееей, пиплы, отзовитесь.
← →
Wistler © (2004-04-11 02:23) [27]Sorry, IDTelnet
← →
Pohil © (2004-04-12 00:29) [28]Можно простой вопрос: как зарегиться под другим пользователем?
← →
Hkr © (2004-04-24 11:03) [29]
> 2Pohil ©
А если сделать и распихать по всем компам программк, которая будет висеть на каком-нибудь порту, и ждать, когда придет комманда выключить комп?
← →
Narayan © (2004-04-24 13:54) [30]Pohil © (08.04.04 22:17) [17]
1.Как не вставая с места получить права именно на удаленной машине?
Для этого на контроллере домена должно находиться учётная запись(1) логин и пароль которой ты знаешь.
2.Как, опять же, не вставая с места создать аккаунт для себя на удаленном компе.
Для этого учётная запись(1) должна обладать правами администратора ;)
Было бы странно, если б каждый мог не вставая с места всё подряд перегружать. Не так ли?
← →
narayan © (2004-04-24 13:59) [31]Ну и вот. Если такая учётная запись имеется и ты войдёшь в домен под ней, твоя прога сможет получить права на перезгрузку любого члена энтого домена.
А можно логониться без админских прав, но прогу твою запускать от имени другой учётной записи.
← →
Cobalt © (2004-04-24 14:26) [32]Имхо, это уже не администрирование, а как-то по другому называется.
Вот у нас в фирме - компов ~20, и на всех стоят Win2K или WinXP. И все - в домене. Автоматическое обновление, и т.п.
Вот ЭТО - администрирование.
← →
Unknown user © (2004-04-26 19:05) [33]2 Pohil. Не занимайся ерундой. Дпя управления учетными записями в W2K используют WMI, и для твоей задачи давно уже изобретено множество программ для удаленного администрирования, причем при отсутствии домена используются программы клиенты на удаленных ПК.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.06.06;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.03 c