請問這段關於SetFileSecurity的程式碼? |
|
chiehmin
高階會員 ![]() ![]() ![]() ![]() 發表:13 回覆:134 積分:134 註冊:2002-05-23 發送簡訊給我 |
有些東西在Delphi裡沒有宣告(如ACL_SIZE_INFORMATION..等等)..
請問各位高手要如何才能成功執行這段程式碼呢? 謝謝!! procedure TForm1.Button1Click(Sender: TObject);
var
FileName : array[0..1023] of char;
ptrFileName : Pchar;
// SID
psnuType : SID_NAME_USE;
szDomain : array[0..15] of char;
lpszDomain : PCHAR;
dwDomainLength : DWORD;
UserSID : array[0..1023] of char;
ptrUserSID : PSID;
dwSIDBufSize : DWORD;
SD_SIZE : DWORD; //
UserName : array[0..1023] of char;
lpszUserName : PCHAR;
dwUserNameLength : DWORD; //
{UCHAR ucSDbuf[SD_SIZE];
PSECURITY_DESCRIPTOR pFileSD=(PSECURITY_DESCRIPTOR)ucSDbuf;
DWORD dwSDLengthNeeded;}
ucSDbuf : PCHAR;
FileSD : array[0..65536 SECURITY_DESCRIPTOR_MIN_LENGTH -1] of byte;
ptrFileSD : PSECURITY_DESCRIPTOR;
dwSDLengthNeeded : DWORD; // ACL ptrACL : PACL;
bDaclPresent : BOOL;
bDaclDefaulted : BOOL;
AclInfo : ACL_SIZE_INFORMATION; //
ptrNewACL : PACL;
dwNewACLSize : DWORD; //
{UCHAR NewSD[SECURITY_DESCRIPTOR_MIN_LENGTH];
PSECURITY_DESCRIPTOR psdNewSD=(PSECURITY_DESCRIPTOR)NewSD;}
NewSD : PCHAR;
FileNewSD : array[0..65536 SECURITY_DESCRIPTOR_MIN_LENGTH -1] of byte;
ptrFileNewSD : PSECURITY_DESCRIPTOR;
dwAcessMask : DWORD;
// AclSizeInformation : TAclInformationClass;
//
TempAce : ACE_HEADER;
ptrTempAce : Pointer;
CurrentAceIndex : DWORD;
//
isError : Boolean;
ACL_REVISION : DWORD;
begin
isError := False;
// Step 1
lpszUserName := UserName;
dwUserNameLength := 1024;
if (not GetUserName(lpszUserName,dwUserNameLength)) then
begin
ShowMessage('Cannot Get UserID');
end else
begin
ShowMessage('UserID is ' UserName 'Size is ' IntToStr(dwUserNameLength));
end;;
// UserName := 'test';
// Step 2:
ptrUserSID := @UserSID;
lpszDomain := szDomain;
dwSIDBufSize := sizeof(UserSID);
dwDomainLength := sizeof(szDomain);
if (not LookupAccountName(nil,lpszUserName,ptrUserSID,dwSIDBufSize,lpszDomain,dwDomainLength,psnuType)) then
begin
ShowMessage('Cannot Get UserSID');
end else
begin
ShowMessage('SID is ' UserSID);
end; // Step 3:
FileName := 'c:\testtest';
SD_SIZE := (65536 SECURITY_DESCRIPTOR_MIN_LENGTH);
ptrFileName := FileName;
ptrFileSD := @FileSD; if not GetFileSecurity(ptrFileName,DACL_SECURITY_INFORMATION,ptrFileSD,SD_SIZE,dwSDLengthNeeded) then
begin
ShowMessage('Cannot Get GetFileSecurity' intToStr(GetLasterror()));
end else
begin
ShowMessage('SID Get! ');
end;;
// Step 4:
ptrFileNewSD := @FileNewSD;
if not InitializeSecurityDescriptor(ptrFileNewSD,SECURITY_DESCRIPTOR_REVISION) then
begin
ShowMessage('Cannot InitializeSecurityDescriptor');
end else
begin
ShowMessage('InitializeSecurityDescriptor! ');
end;;
// Step 5:
if not GetSecurityDescriptorDacl(ptrFileSd,bDaclPresent,ptrACL,bDaclDefaulted) then
begin
ShowMessage('Cannot GetSecurityDescriptorDacl');
end else
begin
ShowMessage('GetSecurityDescriptorDacl! acl ');
if bDaclPresent then
ShowMessage(' Exist DACL')
else
ShowMessage(' No DACL');
end;
// Step 6: if not GetAclInformation(ptrACL^,@aclinfo,sizeof(ACL_SIZE_INFORMATION),AclSizeInformation) then
begin
ShowMessage('Cannot GetAclInformation');
end else
begin
ShowMessage('GetAclInformation!');
end;
// Step 7: dwNewACLSize := AclInfo.AclBytesInUse sizeof(ACCESS_ALLOWED_ACE) GetLengthSid(ptrUserSID) - sizeof(DWORD); // Step 8:
ptrNewACL := allocmem(dwNewACLSize);
// Step 9:
ACL_REVISION := 2;
if not InitializeAcl(ptrNewACL^, dwNewACLSize, ACL_REVISION) then
begin
ShowMessage('Cannot new ACL InitializeAcl');
end else
begin
ShowMessage('Done ACL InitializeAcl' IntToStr(ACL_REVISION));
end;
// Step 10:
if (bDaclPresent) then //DACL
begin
// Step 11:
if (AclInfo.AceCount <> 0) then
begin
for CurrentAceIndex := 0 to AclInfo.AceCount - 1 do
begin
// Step 12:
if GetAce(ptrACL^,CurrentAceIndex,ptrTempAce) then
begin
memo1.Lines.Add('ace :' FormatFloat('#',CurrentAceIndex 1));
memo1.Lines.Add(FormatFloat('#',Ace_Header(ptrTempAce).AceType));
memo1.Lines.Add(FormatFloat('#',Ace_Header(ptrTempAce).AceFlags));
memo1.Lines.Add(FormatFloat('#',Ace_Header(ptrTempAce).AceSize));
// Step 13:
if not AddAce(ptrNewACL^,ACL_REVISION,0,@ptrTempAce,Ace_Header(ptrTempAce).AceSize) then
begin
ShowMessage('Error Code is ' IntToStr(GetLastError()));
isError := True;
end;
end else
isError := True;
end;
end;
end;
memo1.Lines.Add('before');
memo1.Lines.Add(FormatFloat('#',ptrNewACL^.AceCount));
memo1.Lines.Add(FormatFloat('#',ptrNewACL^.AclRevision));
memo1.Lines.Add(FormatFloat('#',ptrNewACL^.AclSize));
memo1.Lines.Add(FormatFloat('#',ptrNewACL^.Sbz1));
memo1.Lines.Add(FormatFloat('#',ptrNewACL^.Sbz2)); // Step 14:
dwAcessMask := $0;
if not isError then
begin
if not AddAccessAllowedAce(ptrNewACL^,ACL_REVISION,dwAcessMask,ptrUSERSID) then
isError := True;
end;
memo1.Lines.Add('after');
memo1.Lines.Add(FormatFloat('#',ptrNewACL^.AceCount));
memo1.Lines.Add(FormatFloat('#',ptrNewACL^.AclRevision));
memo1.Lines.Add(FormatFloat('#',ptrNewACL^.AclSize));
memo1.Lines.Add(FormatFloat('#',ptrNewACL^.Sbz1));
memo1.Lines.Add(FormatFloat('#',ptrNewACL^.Sbz2)); // Step 15:
if not isError then
begin
if not SetSecurityDescriptorDacl(ptrFileNewSD,true,ptrNewACL,false) then
isError := True;
end;
// Step 16:
if not isError then
if SetFileSecurity(ptrFileName,DACL_SECURITY_INFORMATION,ptrFileNewSD) then
isError := True; freemem(ptrNewACL);
end; 發表人 - chiehmin 於 2002/05/29 10:33:54
|
hagar
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
引言: 有些東西在Delphi裡沒有宣告(如ACL_SIZE_INFORMATION..等等).. 請問各位高手要如何才能成功執行這段程式碼呢? 謝謝!! procedure TForm1.Button1Click(Sender: TObject);// 補上這個 Type ACL_SIZE_INFORMATION = record AceCount: DWORD; AclBytesInUse: DWORD; AclBytesFree: DWORD; end; PACE_HEADER = ^ACE_HEADER; ACE_HEADER = Record AceType: BYTE; AceFlags: BYTE; AceSize: WORD; end; const ACCESS_ALLOWED_ACE = 0;var FileName : array[0..1023] of char; ptrFileName : Pchar; |
chiehmin
高階會員 ![]() ![]() ![]() ![]() 發表:13 回覆:134 積分:134 註冊:2002-05-23 發送簡訊給我 |
感覺hagar大大怎麼什麼都會呢? 請問哦
const
ACCESS_ALLOWED_ACE = 0;
為什麼設為0呢? 意義何在呢?
會不會影響到程式裡面動態取得的變數呢? 我執行了這段程式碼? 可是對目錄安全性的內容似乎沒什麼變化?
也沒有把UserName新增進去..Why?? 謝謝~
引言:引言: 有些東西在Delphi裡沒有宣告(如ACL_SIZE_INFORMATION..等等).. 請問各位高手要如何才能成功執行這段程式碼呢? 謝謝!! procedure TForm1.Button1Click(Sender: TObject);// 補上這個 Type ACL_SIZE_INFORMATION = record AceCount: DWORD; AclBytesInUse: DWORD; AclBytesFree: DWORD; end; PACE_HEADER = ^ACE_HEADER; ACE_HEADER = Record AceType: BYTE; AceFlags: BYTE; AceSize: WORD; end; const ACCESS_ALLOWED_ACE = 0;var FileName : array[0..1023] of char; ptrFileName : Pchar; |
hagar
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
1.太抬舉小弟了, 小弟怎麼可能什麼都會呢! :)
小弟只是把您的程式的錯誤部份拿去搜尋, 找到一些線索
就依樣畫葫蘆把它貼上來罷了。
2.把
const ACCESS_ALLOWED_ACE = 0;改成 PACCESS_ALLOWED_ACE = ^ACCESS_ALLOWED_ACE; ACCESS_ALLOWED_ACE = record Header: ACE_HEADER ; Mask: ACCESS_MASK ; SidStart: DWORD ; end;3.小弟實在不知道這段程式碼的用意何在 得一句一句配合著 Help 才能瞭解(目前也還不了解 :) ) 您說 "對目錄安全性的內容沒什麼變化" 以及 "沒有把 UserName 新增進去" 所以請問一下, 如何看到目錄的安全性內容? 還有把 UserName 新增至哪? |
chiehmin
高階會員 ![]() ![]() ![]() ![]() 發表:13 回覆:134 積分:134 註冊:2002-05-23 發送簡訊給我 |
我也試著看Win32API的Help囉~~
不過就是越搞錯誤越多囉~~~~沒像你一樣能很快的解決問題~~
不知道API宣告和Delphi宣告..有何方法可以容易了解?? 就是例如我在win2000建一個c:\testtest這個目錄
然後利用檔案總管..將這個目錄的安全性..加一個用戶利如everyone
然後把everyone的權限例如寫入、修改權打勾選取....
而我猜這段程式碼應該是作這件事..把某個用戶新增至某個目錄的安全性中..
然後修改其權限........
這是我在一個日本網站找到的..一個日本人將MSDN上的程式碼原封不動轉為Delphi程式碼.... 我的目的是希望這些動作能交由程式處理..不需要讓客戶再手動處理這種步驟..
引言: 1.太抬舉小弟了, 小弟怎麼可能什麼都會呢! :) 小弟只是把您的程式的錯誤部份拿去搜尋, 找到一些線索 就依樣畫葫蘆把它貼上來罷了。 2.把const ACCESS_ALLOWED_ACE = 0;改成PACCESS_ALLOWED_ACE = ^ACCESS_ALLOWED_ACE; ACCESS_ALLOWED_ACE = record Header: ACE_HEADER ; Mask: ACCESS_MASK ; SidStart: DWORD ; end;3.小弟實在不知道這段程式碼的用意何在 得一句一句配合著 Help 才能瞭解(目前也還不了解 :) ) 您說 "對目錄安全性的內容沒什麼變化" 以及 "沒有把 UserName 新增進去" 所以請問一下, 如何看到目錄的安全性內容? 還有把 UserName 新增至哪? |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |