-
Пробовал так, но всё время ошибка 87:
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 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;
function SID_GetUserSID(Machine,AccountName:string):Pointer;
var
PSID, PRef: Pointer;
SIDSize, RefSize, peUse: Cardinal;
begin
SIDSize:=0;
RefSize:=0;
LookupAccountName(PChar(Machine),PChar(AccountName),nil,SIDSize,nil,
RefSize,peUse);
GetMem(PSID,SIDSize);
GetMem(PRef,RefSize);
try
if not LookupAccountName(PChar(Machine),PChar(AccountName),PSID,
SIDSize, PRef,RefSize,peUse) then begin
result:=nil;
exit;
end else result:=PSID;
finally
FreeMem(PRef);
FreeMem(PSID);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var Sid:Pointer;
Sd:PSecurityDescriptor;
i:integer;
begin
SetPrivilege('SeTakeOwnershipPrivilege', true); sid:=SID_GetUserSID('','Администратор');
if sid<>nil then begin
GetMem(Sd,1024);
InitializeSecurityDescriptor(Sd,SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorOwner(Sd,Sid, False);
i:=SetNamedSecurityInfo('E:\',SE_FILE_OBJECT,OWNER_SECURITY_INFORMATION,@sid,nil ,nil,nil);
if i = ERROR_SUCCESS then caption:='1' else caption:=inttostr(i);
FreeMem(Sd);
end;
SetPrivilege('SeTakeOwnershipPrivilege', false); end; Где ошибка? Заранее спасибо.
-
if i = ERROR_SUCCESS then caption:='1' else caption:=SysErrorMessage(i);
-
Выдаёт что неверно задан параметр, а вот какой именно так и не ясно.
-
Мне почему-то кажется что неверно я получаю Sid, но вот что там не так не понятно.
-
Код не работал потому что было в SetNamedSecurityInfo @Sid, а надо просто Sid
-
В какой строке, ну не искать же нам самим.
-
Вот в этом ошибка:
i:=SetNamedSecurityInfo('E:\',SE_FILE_OBJECT,OWNER_SECURITY_INFORMATION,@sid,nil ,nil,nil);
надо так:
i:=SetNamedSecurityInfo('E:\',SE_FILE_OBJECT,OWNER_SECURITY_INFORMATION,sid,nil ,nil,nil);
-
в Windows7 работает этот код только под правами администратора, но возможно ли его заставить работать под обычной учётной записью? Наверно какие-то ещё нужны права доступа, т.к. пишет отказано в доступе.
-
> Наверно какие-то ещё нужны права доступа
наверное. если б не наверное, то тогда вся идеология прав нахрен не нужна.
-
A standard user account contains only the following Windows privileges: SeChangeNotifyPrivilege SeShutdownPrivilege SeUndockPrivilege SeIncreaseWorkingSetPrivilege SeTimeZonePrivilege
Note What Windows privileges the filtered access token contains are based on whether the original access token contained any of the restricted RIDS listed above. If any of the restricted RIDs were in the access token, all of the Windows privileges are removed except: SeChangeNotifyPrivilege SeShutdownPrivilege SeUndockPrivilege SeReserveProcessorPrivilege SeTimeZonePrivilege If no restricted RIDs were in the access token, only the following Windows privileges are removed: SeCreateTokenPrivilege SeTcbPrivilege SeTakeOwnershipPrivilege SeBackupPrivilege SeRestorePrivilege SeDebugPrivilege SeImpersonatePrivilege SeRelabelPrivilege The first access token, called the filtered access token, has the previous RIDs (if present) marked as USE_FOR_DENY_ONLY in the access token and the administrative Windows privileges, not listed previously, removed. The filtered access token will be used by default when the user launches applications. The unmodified full administrator access token is then attached to the filtered access token and is used when requests are made to launch applications with a full administrator access token.
|