Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.04.2009, 08:26   #1
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию Как правильно стать владельцем файла?

Всем доброго времени.
Проблема На сервере некоторая туча файлов после сбоя заблокировалась, слетели все доступы и владелец

Задача Вернуть файлам доступы и скопировать их на зеркало. Но поскольку ни доступов ни владельца нет, соответственно скопировать не получается. Приходится вручную давать настройки безопасности, на что уходит много времени

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

Программа Сам я с секьюритями не сильно разбирался, но пришлось. Подчитал хелп, и вот что написал:

Код:
//****************************************************
   function SID_GetUserSID;
var
  PSID, PRef: Pointer;
  SIDSize, RefSize, peUse: Cardinal;

begin
  SIDSize:=0;
  RefSize:=0;
  // Первый вызов функции позволяет получить необходимые размеры буферов
  // для SID и имени домена
  LookupAccountName(PChar(Machine),PChar(AccountName),nil,SIDSize,nil,
    RefSize,peUse);
  GetMem(PSID,SIDSize);
  GetMem(PRef,RefSize);
  try
    // Получаем SID учетной записи
    if not LookupAccountName(PChar(Machine),PChar(AccountName),PSID,
      SIDSize, PRef,RefSize,peUse) then begin
      result:=0;
      exit;
    end else result:=PSID;
  finally
    FreeMem(PRef);
    FreeMem(PSID);
  end;
end;
//****************************************************
...
begin
sid:=SID_GetUserSID(Edit1.Text,'');
Memo1.Lines.Text:='Взят SID из '+IntToStr(integer(sid));
if sid<>nil then
 Memo1.Lines.Text:=Memo1.Lines.Text+' ['+SID_SidToName(sid)+']';

SetLastError(0);
 IsValidSid(sid);
  err:=GetLastError; Memo1.Lines.Add('IsValidSid(sid); - '+SysErrorMessage(err));

SetLastError(0);
 InitializeSecurityDescriptor(@sd,SECURITY_DESCRIPTOR_REVISION);
  err:=GetLastError; Memo1.Lines.Add('InitializeSecurityDescriptor(@sd,2) - '+SysErrorMessage(err));
{SetLastError(0);
 GetSecurityDescriptorOwner(@sd,SID,pbOwnerDefaulted);
  err:=GetLastError; Memo1.Lines.Add('GetSecurityDescriptorOwner(@sd,SID,true) - '+SysErrorMessage(err));
   Memo1.Lines.Add('SID - '+IntToStr(integer(sid)));
{}
SetLastError(0);
 SetSecurityDescriptorOwner(@sd,SID,pbOwnerDefaulted);
  err:=GetLastError; Memo1.Lines.Add('SetSecurityDescriptorOwner(@sd,SID,true) - '+SysErrorMessage(err));
SetLastError(0);
 SetNamedSecurityInfo(pchar(ShellTreeView1.Path),SE_FILE_OBJECT,OWNER_SECURITY_INFORMATION,@sid,nil,nil,nil);
  err:=GetLastError; Memo1.Lines.Add('SetNamedSecurityInfo - '+SysErrorMessage(err));
end;
Результат Программа срабатывает и выдает такое:

Цитата:
Взят SID из 9458416 [S-1-117440512]
IsValidSid(sid); - Операция успешно завершена
InitializeSecurityDescriptor(@sd,2) - Операция успешно завершена
SetSecurityDescriptorOwner(@sd,SID, true) - Операция успешно завершена
SetNamedSecurityInfo - Операция успешно завершена
Но тем не менее владелец выбранного мной файла не изменился

Вопрос Что я делаю не так или что не учитываю? Если у кого есть пример или описание работы с онными функами просьба показать

Заранее спасибо...

p.s. Если что задам этот вопрос еще кое-где...
I'm learning to live...

Последний раз редактировалось Stilet; 27.04.2009 в 11:24.
Stilet вне форума Ответить с цитированием
Старый 31.05.2009, 15:57   #2
sysyman
Пользователь Подтвердите свой е-майл
 
Аватар для sysyman
 
Регистрация: 04.07.2007
Сообщений: 75
По умолчанию

Прежде чем менять владельца, необходимо включить привилегию SeTakeOwnershipPrivilege. Она по умолчанию отключена. Только после ее включения возможно сменить владельца файла. Даже если файл для вас будет явно заблокирован полностью, но у вас будут права админа системы и включена эта привилегия, то можно стать владельцем файла и сменить затем его дескриптор безопасности.

Код:
function SetPrivilege(privilegeName: string; enable: boolean): boolean; 
var
  tpPrev,
  tp        : TTokenPrivileges;
  token      : THandle;
  dwRetLen  : DWord;
begin
  result := False;

  try
  OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, token); //ïполучаем маркер безопасности процесс- токен

  tp.PrivilegeCount := 1;
  if LookupPrivilegeValue(nil, pchar(privilegeName), tp.Privileges[0].LUID) then //получаем идентификатор привилегии - LUID
  begin
    if enable then
      tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED  //устанавливаем атрибуты привилегии
    else
      tp.Privileges[0].Attributes := 0;

    dwRetLen := 0;
    result := AdjustTokenPrivileges(token, False, tp, SizeOf(tpPrev), tpPrev, dwRetLen); //включаем или отключаем привилегию
  end;

  finally
  try
  CloseHandle(token);
  except
  end;
end;
end;



SetPrivilege('SeTakeOwnershipPrivilege', true);//включаем привилегию

function setOnwer(OwnerSid: PSID):boolean;//установим владельца
var
 pSecDescr: PSECURITY_DESCRIPTOR;
begin
result:=false;
     try
 //   ReallocMem(pSecDescr, SizeOf(SECURITY_DESCRIPTOR)); //âûäåëÿåì ïàìÿòü ïîä äåñêðèïòîð

    pSecDescr := PSECURITY_DESCRIPTOR(LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH)); // выделяем память под дескриптор
    if InitializeSecurityDescriptor(pSecDescr, SECURITY_DESCRIPTOR_REVISION) then
     if SetSecurityDescriptorOwner(pSecDescr,OwnerSid, False) then  
if SetNamedSecurityInfo(pchar(Patcfolder),SE_FILE_OBJECT,OWNER_SECURITY_INFORMATION,OwnerSid,nil, nil,nil) = ERROR_SUCCESS then //åñëè áåç îøèáîê
result:=true;// else
//ShowMessage(SysErrorMessage(GetLastError));

   finally
   try
   if pSecDescr <> nil then
   LocalAlloc(LPTR, 0);
   except
   end;
  end;


end;

Последний раз редактировалось rpy3uH; 31.05.2009 в 19:08.
sysyman вне форума Ответить с цитированием
Старый 01.06.2009, 19:38   #3
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

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

Я с этим столкнулся когда в очередной раз переустанавливал Windows и ввёл имя учетной записи такое, какое было у меня до этого, в итоге Виндовс создал новую папку "ИмяУчетнойЗаписи.ИмяКомпьютера ", а старая стала вообще недоступной ни для какого пользователя, в т.ч. для админа, он просто выдавал "Доступ Закрыт" и всё. А там все-все докуметы. Я спросил, и мне посоветовали решить эту проблему через безопасный режим...
BaronTreep вне форума Ответить с цитированием
Старый 18.06.2009, 19:44   #4
Louieze
Новичок
Джуниор
 
Регистрация: 18.06.2009
Сообщений: 1
По умолчанию Как правильно стать владельцем файла

Вот и окончательное и единственное решение проблемы, заключающеся в том, что при использовании common controls 6 с визуальными стилями и новыми шрифтами CreateDragImage не рисует их.

cpp Код: // получаем стандартный шрифт
HFONT hOldFont = HFONTSendMessagehWnd, WM_GETFONT, 0, 0;
// создаём новый шрифт MS Sans Serif с кеглем 8
LOGFONT lf = 0;
StringCchCopylf.lfFaceName, ARRAYSIZElf.lfFaceName, L"MS Sans Serif";
lf.lfHeight = 8;
HFONT hTempFont = CreateFontIndirect&lf;
// уставливаем его без перерисовки ListView
SendMessagehPlaylist, WM_SETFONT, WPARAMhTempFont, FALSE;
// получаем ImageList
hDragIL = ListView_CreateDragImagehPlaylist, iPos, &p;
// устанавливаем обрано стандартный шрифт
SendMessagehPlaylist, WM_SETFONT, WPARAMhOldFont, FALSE;
Louieze вне форума Ответить с цитированием
Старый 07.07.2009, 01:47   #5
rafaello
Новичок
Джуниор
 
Регистрация: 03.07.2009
Сообщений: 2
По умолчанию Как правильно стать владельцем файла

Если мне не изменяет память, то из драгинфо ты получаешь PIDL айтема файловой системы. Из PIDL можно получить путь с помощью GetPathFromIDList не важно путь это к файлу или к папке. Потом с помощью FindFirstFile и FindNextFile найти все файлы в папке.
rafaello вне форума Ответить с цитированием
Старый 07.07.2009, 08:31   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
sysyman
Сенькс, попробуемс.
Цитата:
посоветовали решить эту проблему через безопасный режим...
Хм... Это вариант, но дело в том что сервки в режиме "неостановки". т.е. я морального права не имею их трогать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.11.2009, 12:03   #7
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

туточки up
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 02.11.2009, 12:44   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
raxp
Нееее. Но пасаран такой метод. Я же так файл затру, меня юзера потом повесят за яйки и в млеко опустят )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.11.2009, 12:50   #9
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

Цитата:
Я же так файл затру
что значит затру? эт ж не копирование.. поясни
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 02.11.2009 в 12:55. Причина: содержимое 2 файла (любого) не изменяется, говорю ж проверял
raxp вне форума Ответить с цитированием
Старый 02.11.2009, 13:55   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
raxp
Я не так высказался, я имел ввиду что во-первых мне нужно оставить все права имеющиеся на файле, значит если я хочу и оставить мне нужно их считать, а как это сделать если мне это запрещено? Надо становится владельцем, так что создавать отдельный файл, а потом его права переносить на целевой абсолютно лишнее.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как стать Хакером!!!! Среди нас есть хакеры??? Elaps Свободное общение 234 26.06.2009 15:17
хочу стать программистом - как самому написать сайт? Egorr HTML и CSS 9 06.06.2009 18:39
Как правильно скопировать данные с одного текстового файла в другой? Dem80 Общие вопросы C/C++ 2 06.03.2009 22:17
как стать модетатором gaka1995 О форуме и сайтах клуба 40 11.02.2009 07:32
как можно протестировать и понять толковый ли программист и сможет он стать профи в веб програмировании? mco138 PHP 4 10.09.2007 14:30