Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Запуск себя (программы) из-под другого пользователя / 22 сообщений из 22, страница 1 из 1
26.11.2018, 17:15
    #39738694
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск себя (программы) из-под другого пользователя
Приветствую!

Подскажите, в правильном ли направлении веду поиски?

Итак, есть необходимость, чтобы программа после запуска сама себя бы логинила из-под другого юзера (вводя его логин/пароль и т.д.).

Есть возможность, конечно, запустить свой Exe'шник с помощью функции CreateProcessWithLogonW , но мне захотелось странного, а именно способности программы произвести это в своем процессе . Это реально вообще? Хотя бы у потока (TThread), если по-другому никак.
...
Рейтинг: 0 / 0
26.11.2018, 17:20
    #39738698
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск себя (программы) из-под другого пользователя
Вроде нашлось что-то:

https://stackoverflow.com/questions/23479047/elevated-privileges-with-specific-user-password-on-delphi

1) use LogonUser() to login to the desired user account,
2) then ImpersonateLoggedOnUser() to have the calling thread impersonate that user before performing the desired tasks,
3) and then RevertToSelf() when finished to stop impersonating.
...
Рейтинг: 0 / 0
26.11.2018, 17:24
    #39738699
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск себя (программы) из-под другого пользователя
Если бы мне хотелось так поизвращаться, я бы начал копать в направлении LogonUser() +
ImpersonateLoggedOnUser().
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
26.11.2018, 17:28
    #39738702
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск себя (программы) из-под другого пользователя
Кроик Семён,

вроде оно, сервера так делают вроде бы
...
Рейтинг: 0 / 0
26.11.2018, 17:39
    #39738713
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск себя (программы) из-под другого пользователя
окей спасибо
...
Рейтинг: 0 / 0
26.11.2018, 17:54
    #39738725
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск себя (программы) из-под другого пользователя
Кроик Семён,

Вариант со службой не рассматриваете?
...
Рейтинг: 0 / 0
26.11.2018, 18:01
    #39738731
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск себя (программы) из-под другого пользователя
DarkMaster,

думал об этом, но тогда простая программа превратится в этакого монстра с клиентом и серверной частью в виде службы. Но обещаю, я еще раз подумаю :)
...
Рейтинг: 0 / 0
26.11.2018, 18:23
    #39738743
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск себя (программы) из-под другого пользователя
Когда я не знал о функцииКроик СемёнRevertToSelf()то делал так
Код: pascal
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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
type
  PLogonUserThreadInfo = ^TLogonUserThreadInfo;
  TLogonUserThreadInfo = record
    Token: THandle;
    Handle: THandle;
  end;

function LogonUserThread(const AUserName, ADomain, APassword: string;
  ALogonType: Cardinal; AThreadHandle: THandle): Pointer;
var
  LLogonInfo: PLogonUserThreadInfo absolute Result;
  LLogonToken: THandle;
  LImpersonateToken: THandle;
begin
  GetMem(LLogonInfo, SizeOf(LLogonInfo^));
  try
    LLogonInfo^.Token := 0;
    if not OpenThreadToken(AThreadHandle, TOKEN_IMPERSONATE, True, LLogonInfo^.Token) and
       (GetLastError <> ERROR_NO_TOKEN)
    then
      RaiseLastOSError;
    try
      Win32Check(LogonUser(PChar(AUserName), PChar(ADomain), PChar(APassword),
        ALogonType, LOGON32_PROVIDER_DEFAULT, LLogonToken));
      try
        Win32Check(DuplicateToken(LLogonToken, SecurityImpersonation, @LImpersonateToken));
        try
          Win32Check(SetThreadToken(@AThreadHandle, LImpersonateToken));
        finally
          CloseHandle(LImpersonateToken);
        end;
      finally
        CloseHandle(LLogonToken);
      end;
    except
      CloseHandle(LLogonInfo^.Token);
      raise;
    end;
    LLogonInfo^.Handle := AThreadHandle;
  except
    if LLogonInfo^.Token <> 0 then
      CloseHandle(LLogonInfo^.Token);
    FreeMem(LLogonInfo);
    raise;
  end;
end;

procedure LogoffUserThread(AData: Pointer);
var
  LLogonInfo: PLogonUserThreadInfo absolute AData;
begin
  try
    Win32Check(SetThreadToken(@LLogonInfo^.Handle, LLogonInfo^.Token));
  finally
    if LLogonInfo^.Token <> 0 then
      CloseHandle(LLogonInfo^.Token);
    FreeMem(LLogonInfo);
  end;
end;

...
Рейтинг: 0 / 0
26.11.2018, 19:18
    #39738770
Гирлионайльдо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск себя (программы) из-под другого пользователя
Используй shell с runas и не парься.
...
Рейтинг: 0 / 0
26.11.2018, 19:59
    #39738791
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск себя (программы) из-под другого пользователя
ГирлионайльдоИспользуй shell с runas и не парься.конеш, на продакшн-сервер самое оно
...
Рейтинг: 0 / 0
26.11.2018, 20:22
    #39738793
Фэйтл Эра
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск себя (программы) из-под другого пользователя
Кроик СемёнDarkMaster,

думал об этом, но тогда простая программа превратится в этакого монстра с клиентом и серверной частью в виде службы. Но обещаю, я еще раз подумаю :)
Э... я вот недавно что-то подобное делал, написал крошечный лончер - службу, который запускает приложение и просто следит, не упало ли оно, и презапускает, если надо.
...
Рейтинг: 0 / 0
26.11.2018, 20:27
    #39738794
Фэйтл Эра
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск себя (программы) из-под другого пользователя
Ой, это, пожалуй, не совсем в тему.
...
Рейтинг: 0 / 0
27.11.2018, 10:40
    #39738971
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск себя (программы) из-под другого пользователя
Фэйтл ЭраЭ... я вот недавно что-то подобное делал, написал крошечный лончер - службу, который запускает приложение и просто следит, не упало ли оно, и презапускает, если надо.
Поделишься исходниками? Тоже думал насчет такой запускалки
...
Рейтинг: 0 / 0
27.11.2018, 11:16
    #39738993
Фэйтл Эра
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск себя (программы) из-под другого пользователя
Василий 2,

вечером, если получится.
...
Рейтинг: 0 / 0
27.11.2018, 20:04
    #39739369
Фэйтл Эра
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск себя (программы) из-под другого пользователя
...не, и вечером тоже не получится: дома этих исходников нет, а на работе не очень скоро появлюсь.
...
Рейтинг: 0 / 0
27.11.2018, 21:05
    #39739401
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск себя (программы) из-под другого пользователя
Фэйтл Эраслужбу, который запускает приложение и просто следит, не упало ли оно, и презапускает, если надо.От чьего имени запускается приложение? Где храните логин-пароль пользователя?
...
Рейтинг: 0 / 0
27.11.2018, 21:26
    #39739408
Фэйтл Эра
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск себя (программы) из-под другого пользователя
_Vasilisk_Фэйтл Эраслужбу, который запускает приложение и просто следит, не упало ли оно, и презапускает, если надо.От чьего имени запускается приложение? Где храните логин-пароль пользователя?

Нигде пароли не храню. Сервис инсталлирует админ. У него все пароли и явки. А приложение запускается от того же имени.
Не знаю, от чьего имени... Имя пользователя "Система". Ну, GetUserName() возвращает строку "система". Наверное, это так и есть.
...
Рейтинг: 0 / 0
27.11.2018, 22:50
    #39739442
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск себя (программы) из-под другого пользователя
Кстати вот да, хранение паролей. Как, интересно, это сделано для служб....

Фантазия: хранится в особой секции реестра, в которую если уж попало, значит администратор сохранил. Причем сразу в виде хэша.
...
Рейтинг: 0 / 0
28.11.2018, 17:59
    #39740000
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск себя (программы) из-под другого пользователя
Фэйтл Эраприложение запускается от того же имениПонятно. Тривиальное решение. Зачем тогда это приложение нужно? Сразу бы сервис и делал
...
Рейтинг: 0 / 0
29.11.2018, 01:22
    #39740169
Фэйтл Эра
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск себя (программы) из-под другого пользователя
_Vasilisk_Фэйтл Эраприложение запускается от того же имениПонятно. Тривиальное решение. Зачем тогда это приложение нужно? Сразу бы сервис и делал
Изначально сервис долго не нужен был, сервис в большинстве случаев и сейчас не нужен, и теперь - зачем ломать то, что хорошо работает?
...
Рейтинг: 0 / 0
14.01.2019, 21:30
    #39759551
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск себя (программы) из-под другого пользователя
Кроик СемёнКстати вот да, хранение паролей. Как, интересно, это сделано для служб....


сегодня наткнулся на одну штуку и думаю, а вдруг это ответ: Windows Credential Locker
...
Рейтинг: 0 / 0
14.01.2019, 21:44
    #39759554
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск себя (программы) из-под другого пользователя
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Запуск себя (программы) из-под другого пользователя / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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