線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3165
推到 Plurk!
推到 Facebook!

請問這段關於SetFileSecurity的程式碼?

 
chiehmin
高階會員


發表:13
回覆:134
積分:134
註冊:2002-05-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-05-29 10:27:56 IP:61.221.xxx.xxx 未訂閱
有些東西在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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-05-29 13:13:41 IP:211.22.xxx.xxx 未訂閱
引言: 有些東西在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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-05-29 15:09:56 IP:61.221.xxx.xxx 未訂閱
感覺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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-05-29 16:02:39 IP:211.22.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-05-29 16:18:32 IP:61.221.xxx.xxx 未訂閱
我也試著看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 新增至哪?
系統時間:2024-03-29 17:07:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!