الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف استرجع Sid لجهاز على الشبكة

بدأه زكيري عبد العالي في 10 مارس 2008 · 1 رد · 806 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

كيف استرجع SID اهجاز على الشبكة

H1 class=title>Récupérer le SID et le domaine d'un utilisateur</H1>QUESTION : Comment puis-je récupérer le SID d'un utilisateur d'un domaine
dans une application Visual Basic 6.0 ?

<H2 class=subTitle id=tocHeadRef>Résolution</H2>loadTOCNode(1, 'resolution');
La fonction API LookupAccountName va permettre de récupérer le SID d'un
compte utilisateur d'un domaine.

Dans un formulaire (Form1) ajoutez :
- un bouton de commande (Command1),
- un Label (lblStatus),
- deux TextBox (txtCompte et txtSID).

Copiez le code suivant dans la partie code du formulaire :

Option Explicit

Private Declare Function LookupAccountName Lib "advapi32.dll" Alias
"LookupAccountNameA" _
(ByVal lpSystemName As String, _
ByVal lpAccountName As String, _
SID As Byte, _
cbSid As Long, _
ByVal ReferencedDomainName As String, _
cbReferencedDomainName As Long, _
peUse As Integer) As Long


Private Sub Command1_Click()

Dim buffsize As Long
Dim s As String * 255
Dim szDomain As Long ' Domaine de l'utilisateur
Dim peUse As Integer

Dim strSID As String ' Chaine du SID

Dim i As Long ' Compteur

buffsize = 0
szDomain = 255

Dim SID() As Byte 'SID
Dim lReturn As Long
Dim MyArraySize As Long

MyArraySize = 100
ReDim SID(MyArraySize - 1)

lblStatus.Caption = "Recherche d'informations sur l'utilisateur..."


lReturn = LookupAccountName(vbNullString, _
txtCompte, SID(0), buffsize, s, szDomain, peUse)

' Affichage d'informations sur le retour de la DLL
Debug.Print buffsize
Debug.Print Err.LastDllError
' Si cela échoue
If lReturn <> 0 Then
MsgBox "Erreur lors de l'appel de la fonction."
Exit Sub
Else

' Sinon, Récupération d'informations sur le compte
ReDim SID(buffsize - 1) ' on redimensionne le tableau
lblStatus.Caption = "Recherche d'informations sur l'utilisateur et
SID..."
' On appelle la fonction de nouveau
lReturn = LookupAccountName(vbNullString, _
txtCompte, SID(0), buffsize, s, szDomain, peUse)
Debug.Print Left(s, szDomain)

' Affchage du SID
For i = 0 To UBound(SID)
strSID = strSID + CStr(Hex$(SID(i)))
Next i

Debug.Print "SID :"
Debug.Print strSID
txtSID.Text = strSID
txtDomaine.Text = s
lblStatus.Caption = "Prêt."
End If

If lReturn <> 1 Then
MsgBox "Error lors de l'appel de la fonction."
End If

End Sub


Private Sub Form_Load()
lblStatus.Caption = "Tapez le compte et appuyez sur <SID>"
Command1.Caption = "SID"
txtSID.Text = "Valeur du SID"
End Sub


Lancer le projet et saisir le nom d'un compte NT existant dans la zone de
texte txtCompte, puis cliquer sur le bouton de commande "SID". La valeur
du SID de ce compte NT est affiché dans la zone de texte txtSID

تم تعديل هذه المشاركة بواسطة زكيري عبد العالي في 10 مارس 2008 في 17:48

#2
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
	Button1: TButton;
	Edit1: TEdit;
	procedure Button1Click(Sender: TObject);
  private
	{ Déclarations privées }
  public
	{ Déclarations publiques }
  end;

var
  Form1: TForm1;
const
  SID_REVISION  = 1;

  FILENAME_ADVAPI32	 = 'ADVAPI32.DLL';

  PROC_CONVERTSIDTOSTRINGSIDA   = 'ConvertSidToStringSidA';


type
  TConvertSidToStringSidA = function (Sid: PSID;
	var StringSid: LPSTR): BOOL; stdcall;


implementation

{$R *.dfm}

function WinGetSidStr (Sid : PSid) : string;
var 
  SidToStr	  : TConvertSidToStringSidA; 
  h			 : LongWord; 
  Buf		   : array [0..MAX_PATH - 1] of char; 
  p			 : PAnsiChar; 
begin 
  h := LoadLibrary (FILENAME_ADVAPI32); 
  if h <> 0 then 
  try 
	@SidToStr := GetProcAddress (h, PROC_CONVERTSIDTOSTRINGSIDA); 
	if @SidToStr <> nil then 
	begin 
	  FillChar (Buf, SizeOf(Buf), 0); 

	  if SidToStr (Sid, p) then 
		Result := '[' + string(p) + ']';

	  LocalFree (LongWord(p)); 
	end; 
  finally 
	FreeLibrary (h); 
  end; 
end; 

function GetSidStr (Sid : PSid) : string; 
var 
  Psia		  : PSIDIdentifierAuthority; 
  SubAuthCount  : LongWord; 
  i			 : LongWord; 
begin 
  if IsValidSid (Sid) then 
  begin 
	// 
	// Win 2000+ contains ConvertSidToStringSidA() in advapi32.dll so we just 
	// use it if we can 
	// 
	if (Win32Platform = VER_PLATFORM_WIN32_NT) and 
	  (Win32MajorVersion >= 5) then 
	  Result := WinGetSidStr (Sid) 
	else 
	begin 
	  Psia := GetSidIdentifierAuthority (Sid); 
	  SubAuthCount := GetSidSubAuthorityCount (Sid)^; 
	  Result := Format('[S-%u-', [SID_REVISION]); 
	  if ((Psia.Value[0] <> 0) or (Psia.Value[1] <> 0)) then 
		Result := Result + Format ('%.2x%.2x%.2x%.2x%.2x%.2x', [Psia.Value[0], 
		  Psia.Value[1], Psia.Value[2], Psia.Value[3], Psia.Value[4], 
		  Psia.Value[5]]) 
	  else 
		Result := Result + Format ('%u', [LongWord(Psia.Value[5]) + 
		  LongWord(Psia.Value[4] shl 8) + LongWord(Psia.Value[3] shl 16) + 
		  LongWord(Psia.Value[2] shl 24)]); 

	  for i := 0 to SubAuthCount - 1 do 
		Result := Result + Format ('-%u', [GetSidSubAuthority(Sid, i)^]); 

	  Result := Result + ']'; 
	end; 
end; 
end; 

function GetLocalUserSidStr (const iIP,UserName : string) : string;
var 
  RefDomain	 : array [0..MAX_PATH - 1] of char;	  // enough 
  RefDomainSize : LongWord; 
  Snu		   : SID_NAME_USE;
  Sid		   : PSid; 
  SidSize	   : LongWord; 
begin 
  SidSize := 0; 
  RefDomainSize := SizeOf(RefDomain); 
  Sid := nil; 
  FillChar (RefDomain, SizeOf(RefDomain), 0); 
  LookupAccountName (pchar(iIP), PChar(UserName), Sid, SidSize, RefDomain,
  RefDomainSize, Snu); 
  Sid := AllocMem (SidSize); 
  try
	RefDomainSize := SizeOf(RefDomain);
	if LookupAccountName (nil, PChar(UserName), Sid, SidSize, RefDomain, 
	  RefDomainSize, Snu) then 
	  Result := GetSidStr (Sid); 
  finally 
	FreeMem (Sid, SidSize); 
  end;
end; 

procedure TForm1.Button1Click(Sender: TObject);
begin
edit1.text:=GetLocalUserSidStr('\\1.11.11.11\','zekiri');
end;

end.

شكرا وجدت المطلوب

مواضيع مشابهة