powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Командная строка перезагрузки компьютера (с предупреждением).
15 сообщений из 15, страница 1 из 1
Командная строка перезагрузки компьютера (с предупреждением).
    #36820231
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, на самом деле не по теме немного.
Чтоб было по теме, как это сделать из VB минимум 2 способа я знаю.
Cамый простой
Код: plaintext
        SetupPromptReboot ByVal  0 &,  0 ,  0 
но немножко не то, если не устанавливали драйверов и не меняли конфиг...

Ну и посложнее без диалогов:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
'Restart NT
Public Sub RebootNT(Force As Boolean)
    Dim ret As Long
    Dim Flags As Long
    Flags = EWX_REBOOT
    If Force Then Flags = Flags + EWX_FORCE
    If IsWinNT Then EnableShutDown
    ExitWindowsEx Flags,  0 
End Sub
Private Sub EnableShutDown()
    Dim hProc As Long
    Dim hToken As Long
    Dim mLUID As LUID
    Dim mPriv As TOKEN_PRIVILEGES
    Dim mNewPriv As TOKEN_PRIVILEGES
    hProc = GetCurrentProcess()
    OpenProcessToken hProc, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hToken
    LookupPrivilegeValue "", "SeShutdownPrivilege", mLUID
    mPriv.PrivilegeCount =  1 
    mPriv.Privileges( 0 ).Attributes = SE_PRIVILEGE_ENABLED
    mPriv.Privileges( 0 ).pLuid = mLUID
    ' enable shutdown privilege for the current application
    AdjustTokenPrivileges hToken, False, mPriv,  4  + ( 12  * mPriv.PrivilegeCount), mNewPriv,  4  + ( 12  * mNewPriv.PrivilegeCount)
End Sub

Теперь о проблеме.
Инсталлятор что использую Smart Install Maker (других не предлагать) не имеет опции перезагрузки после Uninstall. Но я считаю, что надо (есть основания).
Но может запустить "чего-нибудь" после деинсталляции.

Т.е. свой exe-шник я применить не могу по определению, ибо они уже удалены на требуемый момент, а "гадить" в %system% думаю нечестно.
shutdown.exe мне не нравится, и он не предлагает выбора.
devcon.exe тоже не годится, тем более это не штатное приложение.

В идеале нужна штатная команда, которая вызывает что-то типа SetupPromptReboot.
Т.е. перегрузить настоятельно рекомендуется, но можешь отказаться.
Есть идеи?
...
Рейтинг: 0 / 0
Командная строка перезагрузки компьютера (с предупреждением).
    #36820628
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
If Msgbox("Таки перезагрузиться?", vbYesNo) = vbYes then
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate,(Shutdown)}\\" & strComputer & "\root\cimv2")

    Set colOperatingSystems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
 
    For Each objOperatingSystem in colOperatingSystems
        objOperatingSystem.Win32Shutdown  2  
    Next
End If
Параметры Win32Shutdown:
0 (0x0) Log Off
4 (0x4) Forced Log Off (0 + 4)
1 (0x1) Shutdown
5 (0x5) Forced Shutdown (1 + 4)
2 (0x2) Reboot
6 (0x6) Forced Reboot (2 + 4)
8 (0x8) Power Off
12 (0xC) Forced Power Off (8 + 4)
...
Рейтинг: 0 / 0
Командная строка перезагрузки компьютера (с предупреждением).
    #36820763
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

Вы меня не поняли. Мне не нужен код VB, и скрипты VBS мне тоже не нужны.
Необходимый и достаточный (рабочий) код VB у меня есть:

Код: plaintext
1.
2.
3.
4.
5.
Private Declare Function SetupPromptReboot Lib "setupapi.dll" (ByRef FileQueue As Long, _
ByVal Owner As Long, ByVal ScanOnly As Long) As Long

Private Sub Command1_Click()
    SetupPromptReboot ByVal  0 &,  0 ,  0 
End Sub
Можно просто
Код: plaintext
   SetupPromptReboot ByVal  0 ,  0 ,  0 
без & но ByVal в первом параметре обязательно.

Мне нужно это сделать без VB. На момент полной деинсталляции у меня уже ничего нет. Есть только системная командная строка !
Я уже покопался, м.б. типа
Код: plaintext
1.
2.
rundll32.exe setupapi.dll,SetupPromptReboot  0 , 0 , 0 
или
rundll32.exe setupapi.dll,SetupPromptReboot  0   0   0 
Но так не работает.
Надо понять как передать в rundll32.exe первый параметр ByVal 0 (если возможно), тогда должно сработать.
...
Рейтинг: 0 / 0
Командная строка перезагрузки компьютера (с предупреждением).
    #36820843
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Есть только системная командная строка!Ну и кто мешает запустить из нее wscript.exe?
...
Рейтинг: 0 / 0
Командная строка перезагрузки компьютера (с предупреждением).
    #36820846
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скажем так, всего один нулевой параметр нужен, но ByVal.
Потому как в VB будет работать код:

Код: plaintext
1.
2.
3.
4.
5.
Private Declare Function SetupPromptReboot Lib "setupapi.dll" (ByRef FileQueue As Long, _
Optional ByVal Owner As Long, Optional ByVal ScanOnly As Long) As Long

Private Sub Command1_Click()
    SetupPromptReboot ByVal  0 
End Sub

Гы, и даже вот так:
Код: plaintext
1.
2.
3.
4.
5.
Private Declare Function SetupPromptReboot Lib "setupapi.dll" (Optional ByVal FileQueue As Long, _
Optional ByVal Owner As Long, Optional ByVal ScanOnly As Long) As Long

Private Sub Command1_Click()
    SetupPromptReboot
End Sub
...
Рейтинг: 0 / 0
Командная строка перезагрузки компьютера (с предупреждением).
    #36820908
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyНу и кто мешает запустить из нее wscript.exe?
И что он будет делать? Без файла сценария в качестве параметра?
Я могу и exe-шник с приведенным мной кодом подкинуть куда нибудь в %temp% или в %system%.
Ну да, могу reboot.vbs записать туда же (и даже программно).
И этот "мусор" останется там навсегда, не так ли?
Все вирусы именно так и делают кажется,как то мне это не нравится...

Мне всего-то надо
Код: plaintext
rundll32 setupapi.dll,SetupPromptReboot <ByVal> 0 
только как этот ByVal туда воткнуть не знаю, очевидно что
Код: plaintext
rundll32 setupapi.dll,SetupPromptReboot  0 
лепит ByRef и поэтому не срабатывает.
...
Рейтинг: 0 / 0
Командная строка перезагрузки компьютера (с предупреждением).
    #36820958
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77И этот "мусор" останется там навсегда, не так ли?Не так. *.vbs может сам себя без проблем стереть. Путь к нему можно предать аргументом wscript или добавить в файл при записи.
Можно использовать консольный аналог wscript — cscript.exe.
...
Рейтинг: 0 / 0
Командная строка перезагрузки компьютера (с предупреждением).
    #36820999
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,
а exe себя сам себя стереть не может?
гы..ну я имею право больше чем на одну команду "после деинсталляции"
М.б.
1) Shell MyReboot.exe
2) Shell del MyReboot.exe
?
главное чтоб reboot не наступил раньше чем del...
...
Рейтинг: 0 / 0
Командная строка перезагрузки компьютера (с предупреждением).
    #36821028
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Второй shell может выполниться быстрее, чем отработает MyReboot.
...
Рейтинг: 0 / 0
Командная строка перезагрузки компьютера (с предупреждением).
    #36821158
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

Код: plaintext
1.
2.
3.
4.
5.
6.
Option Explicit

Private Declare Function SetupPromptReboot Lib "setupapi.dll" (ByRef FileQueue As Long, _
  ByVal Owner As Long, ByVal ScanOnly As Long) As Long
Sub main()
    SetupPromptReboot ByVal  0 &,  0 ,  0 
End Sub
Эта программа выйдет только когда пользователь нажмет в диалоге "ДА" или "НЕТ", т.е. когда SetupPromptReboot вернет результат.

Первому Shell ставится опция "ждать окончания", поэтому второй раньше никак не сработает. Вопрос сработает ли он когда выбран Reboot, но видимо да.

Надо пробовать. Беспокоит уже другое. Команды выполняются "после деинсталляции", но таки до финального окна деинсталлятора с кнопкой "Finish". Не намусорит ли сам деинсталлятор, если он "недоработал" до конца? Т.е. он тоже должен "успеть" после второго Shell...

Вообще странно, что в деинсталляторе нет опции перезагрузка.
Я там удаляю драйвера и меняю режим OS TESTSIGNING->NORMAL (если был и если пользователь подтвердил это на начальном этапе деинсталляции), поэтому перезагрузка с применением именно SetupPromptReboot в данном случае более чем оправдана.
...
Рейтинг: 0 / 0
Командная строка перезагрузки компьютера (с предупреждением).
    #36821174
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Дмитрий77

Ы?
там на странице - Перегрузить Пк - RUNDLL32 SHELL32, SHExitWindowsEx 2

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Командная строка перезагрузки компьютера (с предупреждением).
    #36821216
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос
Перегрузить Пк - RUNDLL32 SHELL32, SHExitWindowsEx 2
Игорь, а вы ето пробовали хотя б на XP.

Ошибка в Shell32
Отсутствует:SHExitWindowsEx

Тогда уж правильнее Shutdown.exe /? ...

Вот если б вы мне на мой вопрос такую ссылку-соображения дали...
Хочу
Код: plaintext
rundll32 setupapi.dll,SetupPromptReboot <ByVal> 0 
...
Рейтинг: 0 / 0
Командная строка перезагрузки компьютера (с предупреждением).
    #36821332
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Команды выполняются "после деинсталляции", но таки до финального окна деинсталлятора с кнопкой "Finish".
И до удаления файлов программы, как выяснилось. Непонятно что он деинсталляцией считает.
Т.е. воткнуть можно в любой exe, только перегрузка в середине деинсталляции точно не нужна.
Проблема...А другой инсталлер не хочу пока...тогда будет много проблем. Плохо.
...
Рейтинг: 0 / 0
Командная строка перезагрузки компьютера (с предупреждением).
    #36821574
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Дмитрий77
> Игорь, а вы ето пробовали хотя б на XP.

Нет не пробовал, у меня нету XP.

> Тогда уж правильнее Shutdown.exe /? ...

А почему не используеш???

> Вот если б вы мне на мой вопрос такую ссылку-соображения дали...
> Хочу
>
> rundll32 setupapi.dll,SetupPromptReboot <ByVal>0

а для чего ByVal указывать, если параметр по другому не передастся? И почему не передаеш ещё два параметра? Хотя у меня
все равно не работает :(

Судя по всему из соображений безопасности закрыли другие способы перегрузки компьютера

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Командная строка перезагрузки компьютера (с предупреждением).
    #36822207
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь ГорбоносНет не пробовал, у меня нету XP.
Судя по всему из соображений безопасности закрыли другие способы перегрузки компьютера
А что, на Висте работает? Скорее всего это из WIN98.

Игорь Горбонос> Тогда уж правильнее Shutdown.exe /? ...
А почему не используеш???
Потому что он не выводит предупреждения. А если выводить окно таймаута, то это вообще "порно", вирусы оч. любят использовать. В VB я пользую те два фрагмента кода, что привел в самом начале. Согласитесь, из VB этого достаточно.

Игорь Горбонос> Вот если б вы мне на мой вопрос такую ссылку-соображения дали...
> Хочу
>
> rundll32 setupapi.dll,SetupPromptReboot <ByVal>0
а для чего ByVal указывать, если параметр по другому не передастся? И почему не передаеш ещё два параметра? Хотя у меня
все равно не работает :(
Один параметр,да можно и три. Я же выше привел соображения почему. Если выполнять из VB, то 2-й и 3-й можно задекларировать как Optional.

Код: plaintext
SetupPromptReboot  0 ,  0 ,  0 
работать не будет, а
Код: plaintext
SetupPromptReboot ByVal  0 ,  0 ,  0 
будет.
Можно и первый параметр опустить, но тогда его надо сразу декларировать как Optional ByVal.
По умолчанию там очевидно ByRef, и именно ByRef срабатывает через Rundll32, и ничего не происходит.
Т.е. если можно как-то запихнуть "ByVal", то долно работать. Вопрос как?
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Командная строка перезагрузки компьютера (с предупреждением).
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]