[WinForm] Application.Restart() - как передать контекст?
От: mDmitriy Россия  
Дата: 07.12.20 20:17
Оценка:
Всем привет!

Есть приложение WinForm
Пользователь открывает его и вводит логин/пароль для доступа к серверу

В один прекрасный момент приложение получает уведомление, что надо обновиться
и вызывает метод Application.Restart()
Соответственно, открывается новый процесс

Есть возможность передать в него логин/пароль, введенные ранее пользователем?
Файл на диске не рассматривается

Спасибо
Re: [WinForm] Application.Restart() - как передать контекст?
От: karbofos42 Россия  
Дата: 07.12.20 20:54
Оценка:
Здравствуйте, mDmitriy, Вы писали:

D>Есть возможность передать в него логин/пароль, введенные ранее пользователем?

D>Файл на диске не рассматривается

D>Спасибо


Ну, Restart перезапускает с теми же параметрами командной строки, что запускалось изначально.
Можно окно с вводом логина/пароля вынести в отдельное приложение, которое просто будет запускать основное приложение, передавая ему через параметры командной строки логин/пароль.
Re: [WinForm] Application.Restart() - как передать контекст?
От: varenikAA  
Дата: 08.12.20 03:48
Оценка:
Здравствуйте, mDmitriy, Вы писали:

D>Есть возможность передать в него логин/пароль, введенные ранее пользователем?

D>Файл на диске не рассматривается

То что вы описывает нарушает политику безопасности.
Простой кейс: пользователь пошел покурить пока устанавливается обновление.
Пришел, а кто-то уже поработал)))
Я бы предложил использовать UserDataProtector в сценарии когда пользователь при авторизации устанавливает опцию "сохранить пароль".
Можно еще для большей безопасности аналогичную "входить автоматически".
Чтобы пользователь мог сам отвечать за безопасность АРМ.
Re: [WinForm] Application.Restart() - как передать контекст?
От: Эйнсток Файр Мухосранск https://raw.githubusercontent.com/EinstokFair/notes-in-russian-language/gh-pages/images/ugroza.gif
Дата: 08.12.20 14:02
Оценка:
Таких способов более семи штук.

Самое очевидное — remoting + shared memory
(ну раз уж там WinForms, то зачем себя сдерживать?)
Re[2]: [WinForm] Application.Restart() - как передать контекст?
От: Danchik Украина  
Дата: 08.12.20 23:06
Оценка:
Здравствуйте, karbofos42, Вы писали:

K>Здравствуйте, mDmitriy, Вы писали:


D>>Есть возможность передать в него логин/пароль, введенные ранее пользователем?

D>>Файл на диске не рассматривается

D>>Спасибо


K>Ну, Restart перезапускает с теми же параметрами командной строки, что запускалось изначально.

K>Можно окно с вводом логина/пароля вынести в отдельное приложение, которое просто будет запускать основное приложение, передавая ему через параметры командной строки логин/пароль.

Это печально. Параметры процесса спокойно можно посмотреть в ProcessExplorer.
Re[2]: [WinForm] Application.Restart() - как передать контекст?
От: mDmitriy Россия  
Дата: 09.12.20 19:43
Оценка:
Здравствуйте, karbofos42, Вы писали:

K>Здравствуйте, mDmitriy, Вы писали:


D>>Есть возможность передать в него логин/пароль, введенные ранее пользователем?

D>>Файл на диске не рассматривается

D>>Спасибо


K>Ну, Restart перезапускает с теми же параметрами командной строки, что запускалось изначально.

Угу... было бы интересно знать где они хранятся, чтобы подменить

K>Можно окно с вводом логина/пароля вынести в отдельное приложение, которое просто будет запускать основное приложение, передавая ему через параметры командной строки логин/пароль.

Слишком муторно
Re[3]: [WinForm] Application.Restart() - как передать контекст?
От: mDmitriy Россия  
Дата: 09.12.20 19:45
Оценка:
Здравствуйте, Danchik, Вы писали:

K>>Можно окно с вводом логина/пароля вынести в отдельное приложение, которое просто будет запускать основное приложение, передавая ему через параметры командной строки логин/пароль.


D>Это печально. Параметры процесса спокойно можно посмотреть в ProcessExplorer.

Зашифровать параметры в строку вообще проблем нет, пусть смотрят...
Re[2]: [WinForm] Application.Restart() - как передать контекст?
От: mDmitriy Россия  
Дата: 09.12.20 19:48
Оценка:
Здравствуйте, varenikAA, Вы писали:

AA>Здравствуйте, mDmitriy, Вы писали:


D>>Есть возможность передать в него логин/пароль, введенные ранее пользователем?

D>>Файл на диске не рассматривается

AA>То что вы описывает нарушает политику безопасности.

смотря какую

AA>Простой кейс: пользователь пошел покурить пока устанавливается обновление.

AA>Пришел, а кто-то уже поработал)))
от этого защищает время перед отключением дисплея, не надо нагружать этим приложение

AA>Я бы предложил использовать UserDataProtector в сценарии когда пользователь при авторизации устанавливает опцию "сохранить пароль".

AA>Можно еще для большей безопасности аналогичную "входить автоматически".
AA>Чтобы пользователь мог сам отвечать за безопасность АРМ.
сохранить куда?
Re[2]: [WinForm] Application.Restart() - как передать контекст?
От: mDmitriy Россия  
Дата: 09.12.20 19:49
Оценка:
Здравствуйте, Эйнсток Файр, Вы писали:

ЭФ>Таких способов более семи штук.


ЭФ>Самое очевидное — remoting + shared memory

ЭФ>(ну раз уж там WinForms, то зачем себя сдерживать?)
remoting потребует пароля
shared memory — кто будет управлять?
Re[3]: [WinForm] Application.Restart() - как передать контекст?
От: varenikAA  
Дата: 10.12.20 01:33
Оценка:
Здравствуйте, mDmitriy, Вы писали:

D>сохранить куда?


UserDataProtector позволяет шифровать данные под текущим пользователем.
Соотвественно сохраняете в профиле пользователя. можно использовать старую добрую Settings scope = user разработанную как раз для винформсов.
Там только нюанс. путь к конфигу генерится в зависимости от пути запуска и св-св сборки. если что-то изменится
конфиг сбросится в ноль.
Re[3]: [WinForm] Application.Restart() - как передать контекст?
От: varenikAA  
Дата: 10.12.20 01:37
Оценка:
Здравствуйте, mDmitriy, Вы писали:

D>от этого защищает время перед отключением дисплея, не надо нагружать этим приложение


Зачем нагружать приложение описанной задачей(перезапуск)? пусть пользователь все сам делает! или еще проще — администратор домена.
Re[3]: [WinForm] Application.Restart() - как передать контекст?
От: karbofos42 Россия  
Дата: 11.12.20 13:16
Оценка: 3 (1)
Здравствуйте, mDmitriy, Вы писали:

D>Здравствуйте, karbofos42, Вы писали:


K>>Здравствуйте, mDmitriy, Вы писали:


D>>>Есть возможность передать в него логин/пароль, введенные ранее пользователем?

D>>>Файл на диске не рассматривается

D>>>Спасибо


K>>Ну, Restart перезапускает с теми же параметрами командной строки, что запускалось изначально.

D>Угу... было бы интересно знать где они хранятся, чтобы подменить

Есть же исходники:
https://github.com/dotnet/winforms/blob/master/src/System.Windows.Forms/src/System/Windows/Forms/Application.cs

Собственно можно написать свой Restart по аналогии с передачей нужных данных.
Re[4]: [WinForm] Application.Restart() - как передать контекст?
От: mDmitriy Россия  
Дата: 11.12.20 18:01
Оценка:
Здравствуйте, karbofos42, Вы писали:

K>Есть же исходники:

K>https://github.com/dotnet/winforms/blob/master/src/System.Windows.Forms/src/System/Windows/Forms/Application.cs

K>Собственно можно написать свой Restart по аналогии с передачей нужных данных.

о-о... спасибо большое
Re[4]: [WinForm] Application.Restart() - как передать контекст?
От: mDmitriy Россия  
Дата: 11.12.20 18:03
Оценка:
Здравствуйте, varenikAA, Вы писали:

AA>UserDataProtector позволяет шифровать данные под текущим пользователем.

AA>Соотвественно сохраняете в профиле пользователя. можно использовать старую добрую Settings scope = user разработанную как раз для винформсов.
AA>Там только нюанс. путь к конфигу генерится в зависимости от пути запуска и св-св сборки. если что-то изменится
AA>конфиг сбросится в ноль.
тот же файл на диске, но через операционку...
вроде как clickonce перезапускает в каталоге рандомным именем
Re[4]: [WinForm] Application.Restart() - как передать контекст?
От: mDmitriy Россия  
Дата: 11.12.20 18:05
Оценка:
Здравствуйте, varenikAA, Вы писали:
D>>от этого защищает время перед отключением дисплея, не надо нагружать этим приложение

AA>Зачем нагружать приложение описанной задачей(перезапуск)? пусть пользователь все сам делает! или еще проще — администратор домена.

администратор домена устанавливает время выключения дисплея
а пользователь выбирает момент, когда ему надо обновить программу
каждый занимается своим делом
Re[5]: [WinForm] Application.Restart() - как передать контекст?
От: karbofos42 Россия  
Дата: 12.12.20 11:40
Оценка: 87 (2) +2
Здравствуйте, mDmitriy, Вы писали:

D>Здравствуйте, varenikAA, Вы писали:

D>>>от этого защищает время перед отключением дисплея, не надо нагружать этим приложение

AA>>Зачем нагружать приложение описанной задачей(перезапуск)? пусть пользователь все сам делает! или еще проще — администратор домена.

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

Ну, когда я работал админом, то терпеть не мог автообновлялки.
Настраиваешь пользователям нормально права, ограничиваешь по максимуму, чтобы не тащить корявые антивирусы и прочие костыли.
Настраиваешь WSUS, разворачиваешь обновления для всяких архиваторов и прочего, для чего нашёлся msi.
В итоге какая-нибудь дебильная сметная программа хочет обновляться именно сама и именно с правами админа. 1С вообще справочник банков обновляла только под админом (либо админ 1С может повозиться отдельно с обновлением, либо пользователь жмёт кнопку "Обновить" и у него запрашивают админские права на терминальном сервере).
Все эти автообновления в итоге снижают безопасность всей сети, т.к. приходится вносить исключения, давать пользователям лишние права и т.д. и т.п.
По иронии судьбы правда сам уже программистом делал автообновление для нашей программы, потому что так хочет заказчик. Админы меня наверно тоже ненавидят и считают сволочью
Re[6]: [WinForm] Application.Restart() - как передать контекст?
От: mDmitriy Россия  
Дата: 12.12.20 12:29
Оценка:
Здравствуйте, karbofos42, Вы писали:

K>По иронии судьбы правда сам уже программистом делал автообновление для нашей программы, потому что так хочет заказчик. Админы меня наверно тоже ненавидят и считают сволочью


ну надо же как-то обновляться...
в нашем случае админских прав не нужно
программа мониторит сервер и в случае появления новой версии уведомляет пользователя
дальше он уже сам

PS. решил я проблему с передачей контекста
Re[7]: [WinForm] Application.Restart() - как передать контекст?
От: karbofos42 Россия  
Дата: 12.12.20 13:46
Оценка:
Здравствуйте, mDmitriy, Вы писали:

D>Здравствуйте, karbofos42, Вы писали:


K>>По иронии судьбы правда сам уже программистом делал автообновление для нашей программы, потому что так хочет заказчик. Админы меня наверно тоже ненавидят и считают сволочью


D>ну надо же как-то обновляться...

D>в нашем случае админских прав не нужно
D>программа мониторит сервер и в случае появления новой версии уведомляет пользователя
D>дальше он уже сам

со стороны админа:
1) непонятная программа лезет на непонятный сервер и что-то оттуда скачивает на комп
2) непонятные данные, загруженные по сети, являются запускаемым приложением и впоследствии сами себя запускают

Я как админ хотел бы вообще настроить SRP и/или AppLocker, установить что нужно в Program Files и дальнейшие все обновление разворачивать через WSUS (для пользователя это значит обновление через центр обновлений или при входе в комп).
Я как админ предприятия могу быть уверен, что завтра этот чей-то сервер не взломают и не подложат вирус, который программа благополучно скачает и запустит?
Re[5]: [WinForm] Application.Restart() - как передать контекст?
От: varenikAA  
Дата: 14.12.20 04:16
Оценка:
Здравствуйте, mDmitriy, Вы писали:

D>а пользователь выбирает момент, когда ему надо обновить программу


Разве я не об этом сказал? Пользователь решает сохранить пароль или нет.
Перезагрузка с паролем означает, что вы это решили за пользователя.
Вам решать.
Re[8]: [WinForm] Application.Restart() - как передать контекст?
От: mDmitriy Россия  
Дата: 15.12.20 04:42
Оценка:
Здравствуйте, karbofos42, Вы писали:

K>со стороны админа:

K>1) непонятная программа лезет на непонятный сервер и что-то оттуда скачивает на комп
K>2) непонятные данные, загруженные по сети, являются запускаемым приложением и впоследствии сами себя запускают

K>Я как админ хотел бы вообще настроить SRP и/или AppLocker, установить что нужно в Program Files и дальнейшие все обновление разворачивать через WSUS (для пользователя это значит обновление через центр обновлений или при входе в комп).

K>Я как админ предприятия могу быть уверен, что завтра этот чей-то сервер не взломают и не подложат вирус, который программа благополучно скачает и запустит?

1) у программы есть сертификат, авторизация (WinDirectory) и пр.
2) см. п.1

я понимаю, что админы хотели бы запретить вообще все, но людям ведь еще и работать надо
у нас все происходит в локальной сети
для удаленщиков есть отдельная защита
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.