Entwickler-Ecke

Windows API - SID eine bestimmen Benutzer auslesen


lemi4ever - Di 29.03.05 23:09
Titel: SID eine bestimmen Benutzer auslesen
Hallo

Ich suchen eine Möglichkeit die SID eines bestimmen User aus der Regedit auslesen zu können. Grund ich muss einen Bereich welcher in der Regedit unter eine speziellen User abgelegt wird auslesen und anschliessend wieder in ein Reg Bereich eintragen.

Kann mir das jemand mit einem Beispiel helfen ?


Gruss

Michael


Moderiert von user profile iconMotzi: Topic aus Sonstiges verschoben am Di 29.03.2005 um 23:16


Harry M. - Di 29.03.05 23:12

was ist denn die SID


Motzi - Di 29.03.05 23:20

SID = security identifier

Also um zu einem Usernamen die SID zu bekommen bzw. umgekehrt gibt es die Funktionen LookupAccountName und LookupAccountSid. Um eine String-Darstellung der SID zu bekommen gibt es ConvertSidToStringSid, da diese Funktion aber erst ab Win2k verfügbar ist, findet man im SDK auch noch diesen C-Code, mit dem das ebenfalls geht:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
BOOL GetTextualSid(
    PSID pSid,            // binary SID
    LPTSTR TextualSid,    // buffer for Textual representation of SID
    LPDWORD lpdwBufferLen // required/provided TextualSid buffersize
    )
{
    PSID_IDENTIFIER_AUTHORITY psia;
    DWORD dwSubAuthorities;
    DWORD dwSidRev=SID_REVISION;
    DWORD dwCounter;
    DWORD dwSidSize;

    // Validate the binary SID.

    if(!IsValidSid(pSid)) return FALSE;

    // Get the identifier authority value from the SID.

    psia = GetSidIdentifierAuthority(pSid);

    // Get the number of subauthorities in the SID.

    dwSubAuthorities = *GetSidSubAuthorityCount(pSid);

    // Compute the buffer length.
    // S-SID_REVISION- + IdentifierAuthority- + subauthorities- + NULL

    dwSidSize=(15 + 12 + (12 * dwSubAuthorities) + 1) * sizeof(TCHAR);

    // Check input buffer length.
    // If too small, indicate the proper size and set last error.

    if (*lpdwBufferLen < dwSidSize)
    {
        *lpdwBufferLen = dwSidSize;
        SetLastError(ERROR_INSUFFICIENT_BUFFER);
        return FALSE;
    }

    // Add 'S' prefix and revision number to the string.

    dwSidSize=wsprintf(TextualSid, TEXT("S-%lu-"), dwSidRev );

    // Add SID identifier authority to the string.

    if ( (psia->Value[0] != 0) || (psia->Value[1] != 0) )
    {
        dwSidSize+=wsprintf(TextualSid + lstrlen(TextualSid),
                    TEXT("0x%02hx%02hx%02hx%02hx%02hx%02hx"),
                    (USHORT)psia->Value[0],
                    (USHORT)psia->Value[1],
                    (USHORT)psia->Value[2],
                    (USHORT)psia->Value[3],
                    (USHORT)psia->Value[4],
                    (USHORT)psia->Value[5]);
    }
    else
    {
        dwSidSize+=wsprintf(TextualSid + lstrlen(TextualSid),
                    TEXT("%lu"),
                    (ULONG)(psia->Value[5]      )   +
                    (ULONG)(psia->Value[4] <<  8)   +
                    (ULONG)(psia->Value[3] << 16)   +
                    (ULONG)(psia->Value[2] << 24)   );
    }

    // Add SID subauthorities to the string.
    //
    for (dwCounter=0 ; dwCounter < dwSubAuthorities ; dwCounter++)
    {
        dwSidSize+=wsprintf(TextualSid + dwSidSize, TEXT("-%lu"),
                    *GetSidSubAuthority(pSid, dwCounter) );
    }

    return TRUE;
}


Gruß, Motzi


Harry M. - Di 29.03.05 23:48

da muss ich passen


lemi4ever - Do 31.03.05 07:30

Vielen Dank für die Unterstützung.

Gruss

Michael


bis11 - Mo 12.12.05 14:44

Hallo,

da ich kein As in C bin. Kann mir da jemand weiterhelfen, wie ich die SID eines Users mit Delphi nun auslesen kann ?


Delete - Mo 12.12.05 15:10


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
function ConvertSidToStringSid(SID: PSID; var StringSid: LPSTR): Boolean; stdcall;
    external 'advapi32.dll' name 'ConvertSidToStringSidA';



function GetAccountSid(const Server, User: WideString; var Sid: PSID): DWORD;
var
  dwDomainSize, dwSidSize: DWord;
  R                 : LongBool;
  wDomain           : WideString;
  Use               : DWord;
begin
  Result := 0;
  SetLastError(0);
  dwSidSize := 0;
  dwDomainSize := 0;
  R := LookupAccountNameW(PWideChar(Server), PWideChar(User), nil, dwSidSize,
    nil, dwDomainSize, Use);
  if (not R) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) then
  begin
    SetLength(wDomain, dwDomainSize);
    Sid := GetMemory(dwSidSize);
    R := LookupAccountNameW(PWideChar(Server), PWideChar(User), Sid,
      dwSidSize, PWideChar(wDomain), dwDomainSize, Use);
    if not R then
    begin
      FreeMemory(Sid);
      Sid := nil;
    end;
  end
  else
    Result := GetLastError;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  SID: PSID;
  strSID: PChar;
  s: String;
  err: DWORD;
begin
  err := GetAccountSid('hal9000''Michael', SID);
  if err = 0 then
  begin
    if ConvertSidToStringSid(SID, strSID) then
      s := strSID
    else
      s := SysErrorMessage(err);
  end
  else
    s := SysErrorMessage(err);

  ShowMessage(s);
end;


bis11 - Mo 12.12.05 20:34

Hallo Luckie,

ich danke Dir schon mal. Ich werde es morgen ausprobieren und sollte ich noch fragen haben, werde ich mich hier melden.


Delete - Mo 12.12.05 20:51

Das ist Luckie-Qualität, da gibt es nichts zum Probieren, das läuft.

Denn nur wo auch Luckie draufsteht, ist auch Luckie drinne.
:mrgreen:


Motzi - Mo 12.12.05 22:21

Hab diese Funktion nicht ich irgendwann mal für dich geschrieben? ;)


Delete - Mo 12.12.05 22:38

Puh, das weiß ich jetzt nicht. Könnte auch von Nico sein. Aber damit meinte ich, dass ich Qualität poste. ;)