谁来帮我找到新“共享资源”的Buf502.shi502_security_descriptor指针? |
尚未結案
|
LargeWon
一般會員 發表:3 回覆:10 積分:2 註冊:2002-12-24 發送簡訊給我 |
program GetNetShares; {$APPTYPE CONSOLE} uses Windows, SysUtils; const NERR_Success = 0; // Success type NET_API_STATUS = DWORD; PShare_Info_0 = ^TShare_Info_0; TShare_Info_0 = record shi0_netname: PWideChar; end; PShare_Info_0_Arr = ^TShare_Info_0_Arr; TShare_Info_0_Arr = array[0..MaxInt div SizeOf(TShare_Info_0) - 1] of TShare_Info_0; PShare_Info_1 = ^TShare_Info_1; TShare_Info_1 = record shi1_netname: PWideChar; shi1_type: DWORD; shi1_remark: PWideChar; end; PShare_Info_1_Arr = ^TShare_Info_1_Arr; TShare_Info_1_Arr = array[0..MaxInt div SizeOf(TShare_Info_1) - 1] of TShare_Info_1; PShare_Info_2 = ^TShare_Info_2; TShare_Info_2 = record shi2_netname: PWideChar; shi2_type: DWORD; shi2_remark: PWideChar; shi2_permissions: DWORD; shi2_max_uses: DWORD; shi2_current_uses: DWORD; shi2_path: PWideChar; shi2_passwd: PWideChar; end; PShare_Info_2_Arr = ^TShare_Info_2_Arr; TShare_Info_2_Arr = array[0..MaxInt div SizeOf(TShare_Info_2) - 1] of TShare_Info_2; PShare_Info_502 = ^TShare_Info_502; TShare_Info_502 = record shi502_netname: PWideChar; shi502_type: DWORD; shi502_remark: PWideChar; shi502_permissions: DWORD; shi502_max_uses: DWORD; shi502_current_uses: DWORD; shi502_path: PWideChar; shi502_passwd: PWideChar; shi502_reserved: DWORD; shi502_security_descriptor: PSECURITY_DESCRIPTOR; end; PShare_Info_1004 = ^TShare_Info_1004; TShare_Info_1004 = record shi1004_remark: PWideChar; end; PShare_Info_1006 = ^TShare_Info_1006; TShare_Info_1006 = record shi1006_max_uses: DWORD; end; PShare_Info_1501 = ^TShare_Info_1501; TShare_Info_1501 = record shi1501_reserved: DWORD; shi1501_security_descriptor: PSECURITY_DESCRIPTOR; end; function NetShareEnum(servername: PWideChar; level: DWORD; var buf: Pointer; prefmaxlen: DWORD; var entriesread: DWORD; var totalentries: DWORD; var resume_handle: DWORD): NET_API_STATUS; stdcall; external 'netapi32.dll'; function NetShareGetInfo(servername: PWideChar; netname: PWideChar; level: DWORD; var buf: Pointer): NET_API_STATUS; stdcall; external 'netapi32.dll'; function EnableSecurityNamePrivilege(Enable: Boolean): Boolean; var hProcess, hToken: THandle; //hTokenPointer: PHANDLE;//Pointer;//THandle; tpNew: TOKEN_PRIVILEGES; TokenPrivileges: TTokenPrivileges; ReturnLength: DWORD; begin Result := False; hProcess := GetCurrentProcess(); //hTokenPointer := @hToken; //if not OpenProcessToken(hProcess, TOKEN_ALL_ACCESS, hTokenPointer) then Exit; if not OpenProcessToken(hProcess, TOKEN_ALL_ACCESS, hToken) then Exit; if not LookupPrivilegeValue(nil, 'SeSecurityPrivilege', tpNew.Privileges[0].Luid) then Exit; if not Enable then tpNew.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED else tpNew.Privileges[0].Attributes := 0; tpNew.PrivilegeCount := 1; ReturnLength := 0; TokenPrivileges.PrivilegeCount := 0; //TokenPrivileges := tpNew; Result := AdjustTokenPrivileges(hToken, False, tpNew, 0, TokenPrivileges, ReturnLength); //ÕâÀï×Ü·µ»ØFalse // if not Result then RaiseLastWin32Error; end; function NetApiBufferFree(P: Pointer): NET_API_STATUS; stdcall; external 'netapi32.dll'; var Server: PWideChar; Buffer, Loop: PShare_Info_0; Buf502: PShare_Info_502; NetResult: DWORD; entriesread: DWORD; totalentries: DWORD; resume_handle: DWORD; I: Integer; begin if not EnableSecurityNamePrivilege(True) then ; //Exit;据《Win2000内幕》讲要先提升本进程的权力 if (ParamCount = 0) then begin Server := nil; end else begin Server := PWideChar(WideString(ParamStr(1))); end; entriesread := 0; totalentries := 0; resume_handle := 0; NetResult := NetShareEnum(Server, 0, Pointer(Buffer), DWORD(-1), entriesread, totalentries, resume_handle); if (NetResult = NERR_Success) then begin Loop := Buffer; WriteLn('Entries read: ', entriesread); for I := 1 to entriesread do begin WriteLn('Name: ', string(Loop.shi0_netname)); try NetResult := NetShareGetInfo(Server, Loop.shi0_netname, 502, Pointer(Buf502)); if (NetResult = NERR_Success) then begin WriteLn('* Net name: ', string(Buf502.shi502_netname)); WriteLn('* Type: ', Buf502.shi502_type); WriteLn('* Remark: ', string(Buf502.shi502_remark)); WriteLn('* Permissions: ', Buf502.shi502_permissions); WriteLn('* Max uses: ', Buf502.shi502_max_uses); WriteLn('* Current uses: ', Buf502.shi502_current_uses); WriteLn('* Path: ', string(Buf502.shi502_path)); WriteLn('* Password: ', string(Buf502.shi502_passwd)); WriteLn('* Reserved: ', Buf502.shi502_reserved); if Buf502.shi502_security_descriptor = nil then WriteLn('* shi502_security_descriptor: ', '怎么还有找不到的?!') else WriteLn('* shi502_security_descriptor: ', '找到了')//谁来找出所有的共享文件夹的shi502_security_descriptor end else begin WriteLn('* Error: ', SysErrorMessage(NetResult)); end; NetApiBufferFree(Buf502); except on E: Exception do WriteLn('* Error: ', E.Message); end; WriteLn; Inc(Loop); end; NetApiBufferFree(Buffer); end; readln; end.如果还没明白我的意思就请运行一下这段代码就明白了。 环境:Win2000专业版 Delphi7 發表人 - LargeWon 於 2004/05/31 14:29:31
------
老王 |
l630521
資深會員 發表:15 回覆:349 積分:372 註冊:2003-02-17 發送簡訊給我 |
在Windows.pas
type
PSECURITY_DESCRIPTOR = Pointer;
if @Buf502.shi502_security_descriptor = nil then WriteLn('* shi502_security_descriptor: ', '怎么还有找不到的?!') else WriteLn('* shi502_security_descriptor: ', '找到了')//谁来找出所有的共享文件夹的shi502_security_descriptor所以我試著加了@,就可以找到了,不知這樣是否正確? Ian |
LargeWon
一般會員 發表:3 回覆:10 積分:2 註冊:2002-12-24 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |