powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Не могу убить прогу, если получилось так, что она запущена с правами админа (тот же юзер)
6 сообщений из 6, страница 1 из 1
Не могу убить прогу, если получилось так, что она запущена с правами админа (тот же юзер)
    #39548617
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Грубо так.
Есть MyProga.exe
Она запускает скрытую форму с шапкой "MyProgaTitle", пока форма висит, прога работает, делает дела (мне так удобно).
Чтобы MyProga.exe корректно вышла, надо просто закрыть форму (послать WM_CLOSE окну "MyProgaTitle").

Итого, код "СТАРТ".
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Try : Shell_Net(IO.Path.Combine(Application.StartupPath, "MyProga.exe"), , ProcessWindowStyle.Hidden) : Catch : End Try

  Public Sub Shell_Net(ByVal PathName As String, _
                       Optional ByVal Parameters As String = vbNullString, _
                       Optional ByVal Style As ProcessWindowStyle = ProcessWindowStyle.Normal)
    Dim ExecInfo As New ProcessStartInfo
    With ExecInfo
      .FileName = PathName
      .Arguments = Parameters
      .WindowStyle = Style
    End With
    Process.Start(ExecInfo)
  End Sub



код "СТОП".
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
KillProga("MyProgaTitle")

  Public Sub KillProga(ByVal proga As String)
    Do
      TargetName = proga
      hwndEnumTarget = IntPtr.Zero
      ' Examine the window names.
      EnumWindows(New EnumWindowsProc(AddressOf EnumProc), 0)
      ' See if we got an hwnd.
      If hwndEnumTarget = IntPtr.Zero Then
        Exit Do
      Else
        EndTask(hwndEnumTarget)
      End If
    Loop
  End Sub

  Public Sub EndTask(ByVal TargetHwnd As IntPtr)
    'Close the window
    If IsWindow(TargetHwnd) Then
      If Not (GetWindowLong(TargetHwnd, GWL_STYLE) _
       And WS_DISABLED) Then
        PostMessage(TargetHwnd, WS_CANCELMODE, 0, IntPtr.Zero)
        PostMessage(TargetHwnd, WM_CLOSE, 0, IntPtr.Zero)
        Application.DoEvents()
      End If
    End If
  End Sub



Все чудненько работает, но возникло одно НО.
Прога MyProga.exe для работы сама по себе не требует администратора.
Но может случиться ситуация, что процесс ее запустивший уже был запущен "As admin", и <СТАРТ> сработал с правами админа.
В этом случае <СТОП> без админских прав не сработает.
EndTask не закроет окно и моя KillProga тупо зависнет на цикле.
Как извратиться, чтоб <СТОП> таки убивал запущенную как "Admin" MyProga.exe.
(!!!юзер тот же)
Полностью исключить ситуацию запуска под админом я не могу.
Например, может быть запущена из-под инсталлятора.
Например, юзер теоретически может запустить управляющее приложение под админом, нажать в нем кнопку <СТАРТ>, которая запустит MyProga.exe. Потом закрыть это управляющее приложение, перезапустить его под НЕ админом, нажать <СТОП> и уже не сработает.

Я пока не копал и тест приложение не делал, код как бы старый, "проверенный", но однако напоролся.

Убивающий (неадминский) процесс очевидно окно видит (иначе б вышел из цикла, не закрыв окно),
но при этом WM_CLOSE видимо не срабатывает.

Можно конечно изменить подход. У меня на MyProga.exe к примеру повешен mailslot (для других целей), команда туда пройдет отовсюду, ну а прога сама себя по этой команде закроет, но не хотелось бы так поступать. Хотя бы потому, что mailslot не создается если в силу какой-то ошибки вдруг запустился другой экземпляр (логически да и кодом исключено, но все же; KillProga, она как раз убивает в этом случае все окна).

М.б. еще Process.Start как-то можно по хитрому сделать, чтоб даже если под админом, не админ смог бы убить вторым кодом?
...
Рейтинг: 0 / 0
Не могу убить прогу, если получилось так, что она запущена с правами админа (тот же юзер)
    #39548670
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну в общем, не ловит окно запущенное под админом месседжы от "юзера".
В данном конкретном случае воспользовался имеющимся в MyProga.exe mailslot.
Т.е. заменил этот kill на mailslot-команду.
MyProga.exe команду эту ловит (неважно как и вообще под чем запущена) и делает сама себе Me.Close.
...
Рейтинг: 0 / 0
Не могу убить прогу, если получилось так, что она запущена с правами админа (тот же юзер)
    #39548690
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77 Как извратиться, чтоб <СТОП> таки убивал запущенную как "Admin" MyProga.exe.
(!!!юзер тот же)

А чё нельзя месседж послать по именованному каналу, чтобы процесс сам убился? По-моему это в любом случае лучше, чем стопать снаружи.
...
Рейтинг: 0 / 0
Не могу убить прогу, если получилось так, что она запущена с правами админа (тот же юзер)
    #39548691
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Т.е. заменил этот kill на mailslot-команду.
MyProga.exe команду эту ловит (неважно как и вообще под чем запущена) и делает сама себе Me.Close.

А ну так да )
...
Рейтинг: 0 / 0
Не могу убить прогу, если получилось так, что она запущена с правами админа (тот же юзер)
    #39548703
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Ну в общем, не ловит окно запущенное под админом месседжы от "юзера".
"дырку" сделай
ChangeWindowMessageFilter или ChangeWindowMessageFilterEx
...
Рейтинг: 0 / 0
Не могу убить прогу, если получилось так, что она запущена с правами админа (тот же юзер)
    #39548780
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Дмитрий77Ну в общем, не ловит окно запущенное под админом месседжы от "юзера".
"дырку" сделай
ChangeWindowMessageFilter или ChangeWindowMessageFilterEx
Спасибо, похоже ответ на мой вопрос, именно как я его задал.

Попробовал
Т.е. если я в MyProga.exe делаю такой код:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  Public Const WS_CANCELMODE = &H1F
  Public Const WM_CLOSE = &H10

  Public Const MSGFLT_ADD = 1
  Public Const MSGFLT_REMOVE = 2

  Public Declare Function ChangeWindowMessageFilter Lib "user32" (ByVal message As Integer, _
   ByVal dwFlag As Integer) As Boolean

  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    ChangeWindowMessageFilter(WS_CANCELMODE, MSGFLT_ADD)
    ChangeWindowMessageFilter(WM_CLOSE, MSGFLT_ADD)
  End Sub



Запускаю MyProga.exe "As Admin"
И делаю свою KillProga из-под НЕ-админ.
Работает, закрывается-убивается.

Единственное,

Minimum supported clientWindows Vista [desktop apps only]
(я пока не брезгую обеспечивать обратную совместимость с XP)
Я так понимаю на XP/2003 этой ситуации в принципе не будет? С админ-НЕадмин для того же юзера? (там же UAC нету, просто не вызываю ChangeWindowMessageFilter и все)


Пока уже сделал через mailslot, кучу времени потратил на переделку <СТОП>-ов (рутина и вызовы из разных мест), но думаю верну назад с учетом сказанного.
Все-таки эта KillProga проверена годами (какая бы дурная она не была, к циклу можно естественно придраться).
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Не могу убить прогу, если получилось так, что она запущена с правами админа (тот же юзер)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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