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
Motzi: 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. ;)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!