powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Изменение прав доступа в коде
9 сообщений из 9, страница 1 из 1
Изменение прав доступа в коде
    #39514271
DastiX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня!
Есть одна любопытная, и, с первого взгляда, несложная задача, но никак не могу ее решить.

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

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

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

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

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

никак... права даются всему приложению... Для этого надо из кода запустить копию приложения под нужными права через runas и уже оттуда делать нужные действия.
Не очень удачный вариант, потому что тогда в приложении необходимо хранить пароль того пользователя, а значит его можно вытащить.
...
Рейтинг: 0 / 0
Изменение прав доступа в коде
    #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
Изменение прав доступа в коде
    #39514300
DastiX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

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

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

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

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


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