Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Изменение прав доступа в коде / 9 сообщений из 9, страница 1 из 1
01.09.2017, 18:44:31
    #39514271
DastiX
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение прав доступа в коде
Доброго дня!
Есть одна любопытная, и, с первого взгляда, несложная задача, но никак не могу ее решить.

Приложение (на Delphi xe10) запускается под виндовым пользователем "Пользователь 1", есть некая папка, доступ к которой разрешен только для пользователя "Системный пользователь".
Как сделать так, что бы при сохранении файла через приложение, функция LoadFromStream вызывалась от имени "Системный пользователь"?

Т.е. из системы пользователь не имеет возможность класть файлы в папку, а через приложение может.

Помогите пожалуйста, знатоки)
...
Рейтинг: 0 / 0
01.09.2017, 19:16:43
    #39514288
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение прав доступа в коде
DastiX,

никак... права даются всему приложению... Для этого надо из кода запустить копию приложения под нужными права через runas и уже оттуда делать нужные действия.
...
Рейтинг: 0 / 0
01.09.2017, 19:40:10
    #39514293
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение прав доступа в коде
DastiX,

Сделай сервис, который ставится при установке приложения и запускается от имени того пользователя который может писать в нужную папку, а из приложения передавай ему что и куда сохранить (через named pipes или ещё как). Только в самом сервисе ограничь места/имена файлов куда он может писать и сделай проверку на то что к нему обращается авторизированное приложение, иначе это может получиться такая себе дыра в безопасности, особенно если тот пользователь с админскими правами :)
...
Рейтинг: 0 / 0
01.09.2017, 19:40:52
    #39514295
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение прав доступа в коде
JaDiDastiX,

никак... права даются всему приложению... Для этого надо из кода запустить копию приложения под нужными права через runas и уже оттуда делать нужные действия.
Не очень удачный вариант, потому что тогда в приложении необходимо хранить пароль того пользователя, а значит его можно вытащить.
...
Рейтинг: 0 / 0
01.09.2017, 19:45:32
    #39514297
DastiX
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение прав доступа в коде
JaDi,

Увы, Вы неправы. Сам разобрался.
Кому интересно, делается это через Winapi'шные функции: ImpersonateLoggedOnUser, RevertToSelf

Пример:
Доступ к папке "D:\12345" настроен только для пользователя "SuperUser"
Приложение запускается от пользователя "User".
У меня все работает на ура. Спасибо http://www.delphibasics.info

Код: 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.
procedure btnClick(Sender: TObject);

function GetCurrUserName: string;
var
  Size              : DWORD;
begin
  Size := MAX_COMPUTERNAME_LENGTH + 1;
  SetLength(Result, Size);
  if GetUserName(PChar(Result), Size) then
    SetLength(Result, Size)
  else
    Result := '';
end;

function Impersonate(const User, PW, DOMIAN: string): Boolean;
var
  LogonType         : Integer;
  LogonProvider     : Integer;
  TokenHandle       : THandle;
  strAdminUser      : string;
  strAdminDomain    : string;
  strAdminPassword  : string;
begin
  LogonType := LOGON32_LOGON_INTERACTIVE;
  LogonProvider := LOGON32_PROVIDER_DEFAULT;
  strAdminUser := USER;
  strAdminDomain := DOMIAN;
  strAdminPassword := PW;
  Result := LogonUser(PChar(strAdminUser), nil,
    PChar(strAdminPassword), LogonType, LogonProvider, TokenHandle);
  if Result then
  begin
    Result := ImpersonateLoggedOnUser(TokenHandle);
  end;
end;

var
   phToken: THandle;
begin
  if Impersonate('SuperUser', 'Password',  'Domain') then //пытаемся авторизоваться как заданный пользователь
  begin
    ShowMessage(GetCurrUserName); //отображаем на всякий случай
    Memo1.Lines.SaveToFile('D:\12345\ttt.txt'); //сохраняем файл
    RevertToSelf; //возвращаемся к собственному логину
    ShowMessage(GetCurrUserName); //проверяем
  end
end;
...
Рейтинг: 0 / 0
01.09.2017, 19:52:17
    #39514300
DastiX
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение прав доступа в коде
alekcvp,

Возможно, но вероятность, что кому-то будет интересен этот пароль - нулевая.
Это задача реализует примитивную защиту файлов, которые сохраняются и просматриваются через специфичное приложение, от вирусов-шифровальщиков.
Файлов много, пользователей много. Если не сделать так, то получается они все доступны для всех со всеми вытекающими.

А тут, элегантно и непринужденно, убирается куча лишнего неожиданного геморроя)

Спасибо всем за внимание, тему можно закрывать)
...
Рейтинг: 0 / 0
02.09.2017, 22:14:36
    #39514518
Mr.Pavel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение прав доступа в коде
добавь
CloseHandle(TokenHandle)
...
Рейтинг: 0 / 0
02.09.2017, 23:27:13
    #39514565
DastiX
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение прав доступа в коде
Mr.Pavel,

в каком именно месте?
...
Рейтинг: 0 / 0
03.09.2017, 23:06:28
    #39514806
Mr.Pavel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение прав доступа в коде
после ImpersonateLoggedOnUser
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Изменение прав доступа в коде / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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