精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● Delphi>>其他>>获得指定机器的用户

主题:获得指定机器的用户
发信人: teleme(PassWord)
整理人: teleme(2001-07-29 19:39:33), 站内信件
//***************以下保存为Unit1.dfm
object Form1: TForm1
  Left = 209
  Top = 156
  Width = 353
  Height = 446
  Color = clBtnFace
  Font.Charset = GB2312_CHARSET
  Font.Color = clWindowText
  Font.Height = -16
  Font.Name = 'System'
  Font.Style = []
  OldCreateOrder = False
  Position = poDesktopCenter
  OnShow = FormShow
  PixelsPerInch = 96
  TextHeight = 16
  object Bevel1: TBevel
    Left = 0
    Top = 0
    Width = 345
    Height = 113
    Align = alTop
  end
  object Label1: TLabel
    Left = 8
    Top = 40
    Width = 14
    Height = 16
    Caption = '域'
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -16
    Font.Name = 'System'
    Font.Style = []
    ParentFont = False
  end
  object cpDomain: TLabel
    Left = 112
    Top = 39
    Width = 4
    Height = 16
    Font.Charset = GB2312_CHARSET
    Font.Color = clWindowText
    Font.Height = -16
    Font.Name = 'System'
    Font.Style = []
    ParentFont = False
  end
  object lbAdmin: TLabel
    Left = 112
    Top = 86
    Width = 4
    Height = 16
    Font.Charset = GB2312_CHARSET
    Font.Color = clWindowText
    Font.Height = -16
    Font.Name = 'System'
    Font.Style = []
    ParentFont = False
  end
  object Label3: TLabel
    Left = 8
    Top = 64
    Width = 84
    Height = 16
    Caption = '检查到的帐号'
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -16
    Font.Name = 'System'
    Font.Style = []
    ParentFont = False
  end
  object Label2: TLabel
    Left = 8
    Top = 13
    Width = 56
    Height = 16
    Caption = '目标主机'
    Font.Charset = GB2312_CHARSET
    Font.Color = clWindowText
    Font.Height = -16
    Font.Name = 'System'
    Font.Style = []
    ParentFont = False
  end
  object EdtHostName: TEdit
    Left = 128
    Top = 8
    Width = 121
    Height = 24
    TabOrder = 0
    Text = '127.0.0.1'
  end
  object Button1: TButton
    Left = 256
    Top = 8
    Width = 75
    Height = 25
    Caption = '开始'
    TabOrder = 1
    OnClick = Button1Click
  end
  object ListBox1: TListBox
    Left = 0
    Top = 113
    Width = 345
    Height = 246
    Align = alClient
    ItemHeight = 16
    TabOrder = 2
  end
  object StatusBar1: TStatusBar
    Left = 0
    Top = 400
    Width = 345
    Height = 19
    Panels = <>
    SimplePanel = True
    SimpleText = '本程序只能在NT上运行。                 For NT only'
  end
  object Panel1: TPanel
    Left = 0
    Top = 359
    Width = 345
    Height = 41
    Align = alBottom
    BevelInner = bvRaised
    BevelOuter = bvLowered
    TabOrder = 4
    object Button3: TButton
      Left = 56
      Top = 8
      Width = 75
      Height = 25
      Caption = '清除'
      TabOrder = 0
      OnClick = Button3Click
    end
    object Button4: TButton
      Left = 200
      Top = 9
      Width = 75
      Height = 25
      Caption = '保存'
      TabOrder = 1
      OnClick = Button4Click
    end
  end
  object Options: TButton
    Left = 256
    Top = 72
    Width = 75
    Height = 25
    Caption = '选项'
    TabOrder = 5
    OnClick = OptionsClick
  end
  object SaveDialog1: TSaveDialog
    DefaultExt = 'txt'
    Filter = 'txt file|*.txt|all files|*.*'
    Options = [ofOverwritePrompt, ofHideReadOnly, ofEnableSizing]
    Left = 160
    Top = 375
  end
end


//***************以下保存为Unit1.pas

unit Unit1;
{  这是一个演示如何去获取目标NT计算机上用户列表的程序 }
interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    EdtHostName: TEdit;
    Button1: TButton;
    Label1: TLabel;
    cpDomain: TLabel;
    lbAdmin: TLabel;
    Label3: TLabel;
    Label2: TLabel;
    ListBox1: TListBox;
    Bevel1: TBevel;
    StatusBar1: TStatusBar;
    Panel1: TPanel;
    Button3: TButton;
    Button4: TButton;
    SaveDialog1: TSaveDialog;
    Options: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure OptionsClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  seedline:String;
implementation

{$R *.DFM}

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;
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('连接错误!');
    WNetCancelConnection2(PChar('\\'+EdtHostName.Text+'\IPC$'),0,true);
    Button1.Enabled:=True;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
      ListBox1.Items.Clear;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
     SaveDialog1.Execute;
     if SaveDialog1.FileName<>'' then ListBox1.Items.SaveToFile(SaveDialog1.FileName);
end;

procedure TForm1.OptionsClick(Sender: TObject);
begin
     seedline:=InputBox('输入','起始用户(推荐使用 "domain users" 或者 "guest")','guest');
end;

procedure TForm1.FormShow(Sender: TObject);
begin
    seedline:='guest';
end;

end.


----
fire engine   

    

[关闭][返回]