![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как программно стать владельцем файла? [D6, WinXP]
Виталий © (2009-04-24 16:02:00)Подскажите пожалуйста как программно стать владельцем файла.
Говорят что нужно использовать SetNamedSecurityInfo, но мне пока не очень понятно как с ней работать, и как правильно передавать и наполнять их.
Если есть другой способ просьба натолкнуть на мысль, литературой или кодом.
Заранее спасибо.
Игорь Шевченко (2009-04-27 18:11:00) [1]
> Ну а как ты думаешь, если бы помогла, стал бы я спрашивать?
Я не в курсе, обычно справки хватает, ее для того и пишут, чтобы хватало.
Виталий (2009-04-27 16:05:00) [2]Удалено модератором
Виталий (2009-04-27 16:04:00) [3]
> clickmaker © (27.04.09 14:34) [5]
Лады, согласен переписал:
if not IsValidSid(sid) then
Memo1.Lines.Add('IsValidSid(sid); - '+SysErrorMessage(err))
else
Memo1.Lines.Add('IsValidSid(sid) ok');
Возвращает isValidSid(sid) ok
т.е. SID Верный, к тому же я по нему правильно получаю имя и аккаунт, так что эта функа точно вне подозрения.
> Игорь Шевченко © (27.04.09 14:42) [6]
Ну а как ты думаешь, если бы помогла, стал бы я спрашивать?
Виталий (2009-04-27 16:04:00) [4]Удалено модератором
Игорь Шевченко (2009-04-27 14:42:00) [5]
> Не пойму как там параметры наполнять. откуда их брать...
Справка тоже не помогает ?
clickmaker (2009-04-27 14:34:00) [6]IsValidSid
If the SID structure is not valid, the return value is zero. There is no extended error information for this function; do not call GetLastError.
(c) MSDN
Виталий (2009-04-27 11:28:00) [7]Вот сообразил такой пример:
//****************************************************
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_IN FORMATION,@sid,nil,nil,nil);
err:=GetLastError; Memo1.Lines.Add('SetNamedSecurityInfo - '+SysErrorMessage(err));
end;
Все функции выполняются без ошибок, но владелец не меняется. Что я не учитываю?
Eraser (2009-04-24 17:38:00) [8]полно ж примеров
http://www.google.com/search?client=opera&rls=ru&q=delphi+SetNamedSecurityInfo&sourceid=opera&ie=utf-8&oe=utf-8
Виталий (2009-04-24 17:06:00) [9]
> гугл не помогает?
неа. пока не очень.
Не пойму как там параметры наполнять. откуда их брать...
Eraser (2009-04-24 16:08:00) [10]> [0] Виталий (24.04.09 16:02)
> Говорят что нужно использовать SetNamedSecurityInfo
правильно говорят.
> но мне пока не очень понятно как с ней работать, и как правильно
> передавать и наполнять их.
гугл не помогает?