Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.06;
Скачать: CL | DM;

Вниз

Помогите разобраться с 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 вся ветка

Текущий архив: 2004.06.06;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.062 c
4-1082128654
WELLiON
2004-04-16 19:17
2004.06.06
меню в трее


14-1085067331
Anarki
2004-05-20 19:35
2004.06.06
Взгляните, LOL


1-1085154438
Lena19
2004-05-21 19:47
2004.06.06
bitmap в stringlist и обратно


14-1084762100
тихий вовочка
2004-05-17 06:48
2004.06.06
исчезновение информации с винта


14-1084908537
Juster~~
2004-05-18 23:28
2004.06.06
Компонент