Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-1085568152
OlegM
2004-05-26 14:42
2004.06.06
Как убрать из строки символ перевода?


14-1084965489
Johnmen
2004-05-19 15:18
2004.06.06
Нашествие студентов. часть 2


14-1084808594
Thor
2004-05-17 19:43
2004.06.06
покупка велосипеда.


14-1085019580
Думкин
2004-05-20 06:19
2004.06.06
С днем рождения! 20 мая


9-1076162450
Pavel
2004-02-07 17:00
2004.06.06
TEditпод DelphiX





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский