首页  编辑  

获取NT的全部用户名称及其他相关信息?如用户描述等。

Tags: /超级猛料/Network.网络通讯/共享和用户、域/   Date Created:

:淡淡的笑, 时间:2001-8-27 19:17:00, ID:607642

EdtHostName.Text 为本机的IP地址或远端IP地址(必须开放IPC$,默认为开)

procedure TForm1.Button1Click(Sender: TObject);

var

   seaNetResource:NETRESOURCE;

   seaResult:DWORD;

   seaAccessBuffer:string[255];

   seaAccessBufferLength:DWORD;

   sidbuffer:string[255];

   lpAccessBuffer:PChar;

   seaSID:PSID;

   seaSIDlength:DWORD;

   seaReferencedDomainName:string[255];

   seaReferencedDomainNameLength:DWORD;

   lpReferencedDomainName:PChar;

   seaSIDnameuse:SID_NAME_USE;

   tempPchar:Pchar;

   SidSubCount:PUCHAR;

   i,j:integer;

   StoreCount:byte;

   tempPDWORD:PDWORD;

   tempDWORD:DWORD;

   storeSIDsub: array [0..8] of Integer;

   seaSidIdentify:PSIDIdentifierAuthority;

   newSID:PSID;

   seaAccountBuffer:String[255];

   pAccountName:LPTSTR;

   AccountLength:DWORD;

   BlResult:Boolean;

   SeedLine:string;

const

   AccountType:array [0..8] of string=('','User','Group','Domain','alias',

                     'WelknowGroup','Deleted','Invalid','Unknown');

begin

    Button1.Enabled:=False;

   lpAccessBuffer:=@seaAccessBuffer;

   lpReferencedDomainName:=@seaReferencedDomainName;

   seaSID:=@sidbuffer;

   seaAccessBufferLength:=64;

   seaSIDLength:=255;

   seaReferencedDomainNameLength:=255;

   seaNetResource.dwScope:=RESOURCE_GLOBALNET;

   seaNetResource.dwType:=RESOURCETYPE_ANY;

   seaNetResource.lpLocalName:=PChar('');

   seaNetResource.lpRemoteName:=PChar('\\'+EdtHostName.Text+'\IPC$');

   seaNetResource.lpProvider:=PChar('');

   seaResult:=WNetAddConnection2(seaNetResource,PChar(''),PChar(''),CONNECT_PROMPT);

   if seaResult=NO_ERROR then

   begin

        if LookupAccountName(PChar('\\'+EdtHostName.Text),Pchar(seedline),seaSID,seaSIDlength,

            lpReferencedDomainName,seaReferencedDomainNamelength,seaSIDnameuse)

        then

        begin

             cpDomain.Caption:=string(lpReferencedDomainName);

             seaSidIdentify:=GetSidIdentifierAuthority(seaSID);

             SidSubCount:=GetSidSubAuthorityCount(seaSID);

             StoreCount:=SidSubCount^;

             for i:=0 to Integer(StoreCount)-1 do

             begin

                  tempPDWORD:=GetSidSubAuthority(seaSID,i);

                  storeSIDsub[i]:=tempPDWORD^;

             end;

             //start to get username

             pAccountName:=@seaAccountBuffer ;

             seaReferencedDomainNameLength:=255;

             AccountLength:=255;

             storeSIDsub[StoreCount-1]:=500;

             if AllocateAndInitializeSid(seaSidIdentify^,SidSubCount^,StoreSidSub[0],

             StoreSidSub[1],StoreSidSub[2],StoreSidSub[3],StoreSidSub[4],

             StoreSidSub[5],StoreSidSub[6],StoreSidSub[7],newSID) then

             begin

                  if LookupAccountSid(PChar('\\'+EdtHostName.Text),newsid,

                  pAccountName,AccountLength,lpReferencedDomainName,

                  seaReferencedDomainNameLength,seaSIDnameuse)

                  then

                  begin

                      lbAdmin.Caption:=String(pAccountName);

                      ListBox1.Items.Add('\\'+lpReferencedDomainName+'\'+pAccountName+'       Built-in Admin');

                  end

                  else

                      exit;

                  FreeSid(newSID);

                  //tempDWORD:=GetLastError;

                  j:=1;

                  i:=1000;

                  while j<=30 do

                  begin

                       seaReferencedDomainNamelength:=255;

                       AccountLength:=255;

                       StoreSidSub[StoreCount-1]:=i;

                       AllocateAndInitializeSid(seaSidIdentify^,SidSubCount^,StoreSidSub[0],

                            StoreSidSub[1],StoreSidSub[2],StoreSidSub[3],StoreSidSub[4],

                            StoreSidSub[5],StoreSidSub[6],StoreSidSub[7],newSID);

                       if LookupAccountSid(PChar('\\'+EdtHostName.Text),newsid,

                            pAccountName,AccountLength,lpReferencedDomainName,

                            seaReferencedDomainNameLength,seaSIDnameuse)

                       then

                       begin

                       if seaSIDnameuse=sidTypeInvalid then j:=j+1

                       else if seaSIDnameuse<>sidTypeDeletedAccount then

                       begin

                           j:=0;

                          ListBox1.Items.Add('\\'+lpReferencedDomainName+

                          '\'+pAccountName+'            '+AccountType[seaSIDnameuse]);

                             StatusBar1.SimpleText:=pAccountName;

                       end;

                       end

                       else

                        j:=j+1;

                       Application.ProcessMessages;

                       i:=i+1;

                       FreeSID(newsid);

                  end;

             end;

        end

        else ShowMessage('Cannot locate sid infomation!');

   end

   else ShowMessage('Connection Error!');

   WNetCancelConnection2(PChar('\\'+EdtHostName.Text+'\IPC$'),0,true);

   Button1.Enabled:=True;

end;