Консультация № 191247
28.07.2017, 10:46
0.00 руб.
0 22 1
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
Есть необходимость запускать из своей программы другое приложение от имени другого пользователя. Как это можно сделать? WinAPI как класс отсутствует напрочь...

Обсуждение

давно
Посетитель
7438
7205
28.07.2017, 10:51
общий
Адресаты:
Я пас...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Мастер-Эксперт
425
4118
28.07.2017, 11:04
общий
Адресаты:
Цитата: Лысков Игорь Витальевич
Я пас...

Ай, вах! На Вас была вся надежда...
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Академик
20764
1861
28.07.2017, 12:15
общий
Это целиком зависит от платформы. Как и сами понятия пользователи, права,.. Под чем надо запускать?
давно
Старший Модератор
17042
808
28.07.2017, 12:19
общий
Адресаты:
Цитата: Хватов Сергей
Это целиком зависит от платформы.


Ну, если в вопросе упоминается WinAPI, то платформа очевидна, ИМХО...
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
давно
Старший Модератор
17042
808
28.07.2017, 12:19
общий
Адресаты:
К слову, про WinAPI, а CreateProcessWithLogonW Вам, случайно, не подойдёт?
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
давно
Посетитель
7438
7205
28.07.2017, 12:24
общий
Адресаты:
Цитата: Вадим Исаев ака sir Henry
WinAPI как класс отсутствует напрочь
У вас сомнения насчет платформы?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Старший Модератор
17042
808
28.07.2017, 12:28
общий
Адресаты:
У меня нет. Хотя я знаю примеры использования WinAPI и под *nix, но это уже извращения, к которым я не склонен.
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
давно
Мастер-Эксперт
425
4118
28.07.2017, 12:30
общий
28.07.2017, 12:31
Адресаты:
Нет, как раз ИМХО (типа wine и прочие погремушки) и нету...
Я сделал под Linux программку-монитор, которая периодически опрашивает RFID-антенну на предмет покладания на неё RFID-карточки. И если эту карточку поклали, то с неё считывается номер, формируется ссылка для браузера и пользователь автоматом заходит в свой личный кабинет на нашем сайте. Поскольку программка - служба системная, то браузер надо запускать от имени залогинившегося пользователя, чтобы браузер прочитал заранее введённые для пользователя настройки.
Пытался сделать запуск с помощью system() - фиг вам... Ничего не запускается. Т.е. "ничего", если моя программка запущена как системная служба. А вот если её запустить уже в залогинившемся пользователе (типа: sudo Моя_Программа), то всё чики-пуки - браузер благополучно стартует.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Старший Модератор
17042
808
28.07.2017, 12:52
общий
Адресаты:
Хм... Как у Вас всё сложно-то... Сформировать командную строку типа "sudo -u <username> <command>", где <username> - имя пользователя, а <command> - имя запускаемой программы и передать её в качестве параметра в функцию system?
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
давно
Мастер-Эксперт
425
4118
28.07.2017, 12:53
общий
Цитата: Андрей Кузнецов aka Dr_Andrew
Сформировать командную строку типа "sudo -u <username> <command>", где <username> - имя пользователя, а <command> - имя запускаемой программы и передать её в качестве параметра в функцию system?

Именно так я и сделал. Результат - см. моё сообщение выше.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Академик
20764
1861
28.07.2017, 13:55
общий
Что за вражеская терминология: системная служба (причём, оба слова)?
Есть процессы, они бывают привилегированные или нет. Есть демоны, есть сервисы, но это уже следующий уровень. Вам что надо: поменять uid/gid процесса, поменять ему environment?.. Всё это можно сделать, если использовать низкоуровневый интерфейс: fork(), exec*()... Но между fork и exec придётся немного повозиться, да и исходный процесс должен быть привилегированным
давно
Мастер-Эксперт
425
4118
29.07.2017, 04:34
общий
Адресаты:
Исходный процесс как раз привилегированный - запускается от рута. Запуск происходит после старта компа из /etc/init.d/.
Вот мне как раз и нужно, чтобы процесс запускал браузер не от рута, а от текущего залогинившегося пользователя с его окружением и чтобы текущий пользователь с ним работал, как будто он его сам запустил.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Академик
20764
1861
29.07.2017, 10:04
общий
Тут основные грабли в другом месте. Запустить графический процесс в чужой графической сессии невозможно: графический сервер к дисплею не пустит. Да и "текущий" - это опять от чужеродной модели: система многозадачная и многопользовательская, никто однозначно к монитору не привязан.
Тут, вероятно надо наоборот: скрипт личного кабинета должен обращаться к демону и получать от него всю авторизационную информацию. Вероятно, через D-BUS, причём через системную шину, так как ни у демона, ни у веб сервера доступа к сессионной шине (а сессий может быть и больше одной) тоже нет.
давно
Мастер-Эксперт
425
4118
29.07.2017, 11:15
общий
Адресаты:
Ага, это Вы хорошую мысль подкинули. Я о таком как-то даже и не подумал. Спасибо!
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Старший Модератор
17042
808
31.07.2017, 06:00
общий
Адресаты:
Оформите ответ?
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
давно
Мастер-Эксперт
425
4118
01.08.2017, 07:19
общий
01.08.2017, 09:52
В общем я придумал так:
- демон, который следит за покладанием карточки на антенну (запущенный от рута при старте системы, т.к. иначе до устройства не добраться), в случае обнаружения карточки считывает её номер и записывает его в текстовый файл "/tmp/Файл_с_номером.txt".
- второй демон, запущеный от текущего пользователя, следит, не появился ли файл "/tmp/Файл_с_номером.txt". И если появился, считывает оттуда номер, стирает файл, формирует URL и запускает с ним браузер.
Покритикуйте меня кто-нибудь...
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Посетитель
7438
7205
01.08.2017, 12:09
общий
01.08.2017, 12:14
Адресаты:
Как минимум, надо будет проверять, что длина файла ненулевая. Или проверять права доступа на чтение.
Т.к. вполне может быть, что первый демон только создал, даже, возможно, записал, но еще не закрыл, а второй - уже увидел имя.

Вообще-то, лично мне не сильно нравится передача данных через файл.
А нельзя, например, применить какой-нибудь pipe-канал, mail-канал или что-то в таком духе? Или такого нет в Linux?
Сергей Хватов упоминал D-Bus. Как один из вариантов...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Мастер-Эксперт
425
4118
01.08.2017, 12:19
общий
Адресаты:
Цитата: Лысков Игорь Витальевич
А нельзя, например, применить какой-нибудь pipe-канал

Да есть, отчего же нет. Просто я с пипками ещё никогда не работал, как-то не было такой задачи. А просто так, потренироваться, как-то до сих пор не собрался...
Цитата: Лысков Игорь Витальевич
Т.к. вполне может быть, что первый демон только создал, даже, возможно, записал, но еще не закрыл, а второй - уже увидел имя.

Разумно. Я поэкспериментирую, насколько это серьёзная проблема. У меня там в циклах проверки карты\файла стоит задержка в 2 секунды, чтобы комп не перепугать до потери пульса.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Мастер-Эксперт
425
4118
01.08.2017, 12:20
общий
Адресаты:
Цитата: Лысков Игорь Витальевич
Сергей Хватов упоминал D-Bus. Как один из вариантов...

Аналогично. Тоже пока с этим делом ещё не работал.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Мастер-Эксперт
425
4118
01.08.2017, 12:23
общий
Адресаты:
В принципе, можно ещё между двумя демонами организовать TCP-обмен данными. Я такие финтифлюшки уже делал, только забыл про это...
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Посетитель
7438
7205
01.08.2017, 12:31
общий
Адресаты:
TCP - тоже неплохой вариант
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Академик
20764
1861
01.08.2017, 19:44
общий
это ответ
Здравствуйте, Вадим Исаев ака sir Henry!
Раз ответов не поступило, придётся ответить. :)
Судя по обсуждению, вы уже поняли, что пошли по неправильному пути.
Только по пути правильному проблем тоже будет немало. Я предложил тот, который сейчас все используют. Я бы реализовал именно так. Но в него надо, что называется, вживаться.
В любом случае внутри одной машины -- это ipc, inter process communication. оно реализовано в модели очень похожей на сетевую. Те же методы. Но -- это не tcp и не udp и вообще не сеть. это отдельный механизм.
5
Спасибо! Идею я понял, буду экспериментировать.
Форма ответа