Autor |
Beitrag |
fuba
      
Beiträge: 125
Win7
D7 Ent.
|
Verfasst: Mi 01.03.06 01:03
Hallo leute!
Ich habe mich gefragt ob es irgendwie mögich ist die Benutzergruppe "Administratoren" irgendwo auszulesen?
bzw. wenn mein prog auf nen Deutschen system läuft is es ja kein problem, aber wenn es auf
anderem system läuft dann ist der name der Benutzergruppe "Administratoren" ja anders
z.b
Deutsch = Administratoren
English = Administrators
French = Administrateurs
usw...
hat da jemand ahnung?
Dankeschön! Moderiert von raziel: Topic aus VCL (Visual Component Library) verschoben am Mi 01.03.2006 um 11:15
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 01.03.06 01:15
Geh über die SID. Die ist auf allen System gleich für die standard Gruppen. Leider habe ich gerade nicht die API Funktionen dafür zur Hand.
Habs: Dazu benutzt du die API Funktion LookupAccountSID und zuerst wandelst du die StringSID (S-x-x-x...) in eine echte SID um mit ConvertStringSidToSid.
|
|
fuba 
      
Beiträge: 125
Win7
D7 Ent.
|
Verfasst: Mi 01.03.06 01:43
äähhh
da stehe ich voll auf der leitung!
ich habe vin SID usw.. schon gehört/gelesen aber noch nie wirklich mit win rechte/security gearbeitet
kenne auch die fertige procedure womit man abfragen kann ob ich admin-rechte habe
dachte es gibt vlt. etwas ähnliches das mir den namen der Gruppe im format "string" zurückgibt.
habe es auch schon mit den dos befehl "Net" versucht und mit "net localgroups" die localen gruppen zurückbekommen
das problem ist, ich bräuchte nur die gruppe die auf deutsch "Administratoren" heist.
bitte nich schlagen bin noch ein noob 
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 01.03.06 02:58
Das hat nix mit Noob zu tun  Luckie ist nur diese API im täglichen Umganng gewohnt *g*
Soviel ich mitbekommen hab:
Ausgangs-SID müsste 'S-1–5-32-544' sein (Lokale Administratoren-Gruppe)
ConvertStringSidToSid um diese SID in eine SID zu konvertieren, die Windows versteht ...
Um diese wieder in einen Account-Namen zu verwandeln, sollte LookupAccountSID funzen.
Keine Garantie auf Richtigkeit, Luckie kennt sich in der Hinsicht besser aus.
Die Nötigen Header werden in der Windows.pas bereits eingebunden. Beachte bitte, dass Du jegliche String-Puffer selber bereitstellen musst.
//Edit: Zusätzlich kann auch über CreateWellKnownSid mit SID-Typ WinBuiltinAdministratorsSid erfragt werden. der zweite Schritt würde dann entfallen.
Siehe auch das Beispiel hier: msdn.microsoft.com/l...eatewellknownsid.asp
bzw. msdn.microsoft.com/l...ng_format_in_c__.asp
HTH.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
fuba 
      
Beiträge: 125
Win7
D7 Ent.
|
Verfasst: Mi 01.03.06 18:55
Ich denk mal ich bin schon nen schritt weiter...
habe das gefunden
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: 77: 78: 79:
| Function GetTextualSid( Sid : PSid; var TextualSid: String; var dwBufferLen : DWORD ) : Boolean; var psia : PSIDIdentifierAuthority; dwSubAuthorities : DWORD; dwSidRev : DWORD; dwCounter : DWORD; dwSidSize : DWORD; begin
dwSidRev := 1; Result := False; if not IsValidSid (sid) then exit;
psia := GetSidIdentifierAuthority (sid);
dwSubAuthorities := GetSidSubAuthorityCount(sid)^;
dwSidSize := (15 + 12 + (12 * dwSubAuthorities) + 1) * SizeOf(Char);
if (dwBufferLen < dwSidSize) then begin dwBufferLen := dwSidSize; SetLastError(ERROR_INSUFFICIENT_BUFFER); Exit; end;
TextualSid := Format ('S-%u-', [dwSidRev]);
if (psia^.Value[0] <> 0) or (psia^.Value[1] <> 0) then begin TextualSid := TextualSid + format ('0x%02x%02x%02x%02x%02x%02x',[ psia^.Value [0], psia^.Value [1], psia^.Value [2], psia^.Value [3], psia^.Value [4], psia^.Value [5]]) end else begin TextualSid := TextualSid + format ('%u', [DWORD (psia^.Value [5]) + DWORD (psia^.Value [4] shl 8) + DWORD (psia^.Value [3] shl 16) + DWORD (psia^.Value [2] shl 24)]); end;
for dwCounter := 0 to dwSubAuthorities - 1 do begin TextualSid := TextualSid + Format ('-%u', [GetSidSubAuthority (sid, dwCounter)^]) end;
Result := True; end; |
aber wie bekomme ich die SID vom ConvertStringSidToSid zurück?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| function GetMySid: psid; var StringSid: string; begin StringSid:='S-x-x-x-x'; ConvertStringSidToSid(GetMySid, pchar(StringSid));
end; |
habs so versucht, aber dann schreibt er:
Konstantenobjekt kann nicht als Var-Parameter weitergegeben werden
P.s.
S-x-x-x-x steht hierbei für S-1–5-32-544
--------
btw.
ich hab schon einen sh ähnlichen beitrag von Luckie gefunden der mir denau das gegenteil macht das ich will
hier:
www.delphi-forum.de/...+auslesen_39277.html
In diesem Topic wird beschrieben wie ich von User/Gruppe die SID bekomme
und genau das, nur umgekehrt bräucht ich ^_^
Zuletzt bearbeitet von fuba am Mi 01.03.06 19:08, insgesamt 1-mal bearbeitet
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 01.03.06 19:00
Du musst Result übergeben als Param, da GetMySID innerhalb des Funktionsrumpfes zu einem Funktionsaufruf führt.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
fuba 
      
Beiträge: 125
Win7
D7 Ent.
|
Verfasst: Mi 01.03.06 19:14
habs mal mit result probiert, geht aber auch net :/
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| function GetMySid: pSID; var SID :pSID; begin ConvertStringSidToSid(SID, pchar('S-1–5-32-544')); Result:=SID; end; |
und so auch
Delphi-Quelltext 1: 2: 3: 4:
| function GetMySid: pSID; begin ConvertStringSidToSid(Result, pchar('S-1–5-32-544')); end; |
bei beiden immer die selbe meldung:
Konstantenobjekt kann nicht als Var-Parameter weitergegeben werden
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 01.03.06 19:18
Ich hab Testweise folgenden Source probiert:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| function ConvertStringSidToSid( StringSid: PChar; var Sid: PSID): Boolean; stdcall; external 'advapi32.dll' name 'ConvertStringSidToSidA';
procedure TForm1.Button1Click(Sender: TObject); var SID: PSID; Name, Temp: String; NameLen, TempLen : DWORD; SIDType: DWORD; const LocalAdminGroupSID = 'S-1-5-32-544'; begin ConvertStringSIDToSID(Pchar(LocalAdminGroupSID), SID); NameLen := 255; Name := ''; TempLen := 255; Temp := ''; SetLength(Name, NameLen); SetLength(Temp, TempLen); LookupAccountSidA(nil, SID, PAnsiChar(@Name[1]), NameLen, PAnsiChar(@Name[1]), TempLen, SIDType); Name := StrPas(PChar(@Name[1])); Caption := Name; end; |
Der funzt zwar für normale User-, Computer und Gruppen-SIDs, aber leider nicht für WellKnown-SIDs ...
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
fuba 
      
Beiträge: 125
Win7
D7 Ent.
|
Verfasst: Mi 01.03.06 19:59
ich glaub ich weis warum der da vordefiniert schreibt
hab mal die SID von meinen Login geholt:
S-1-5-21-1547161642-1644491937-1801674531-500
wenn ich dann diese eingebe dann schreibt er nicht -> Administrator (so wie es sein sollte)
sondern er schreibt mir "FUBA" raus -> mein Domain
habs!!!
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| function GetAdminTest(const StrSID: String): string; var SID: PSID; Name, Temp: String; NameLen, TempLen : DWORD; SIDType: DWORD; begin ConvertStringSIDToSID(Pchar(StrSID), SID); NameLen := 255; Name := ''; TempLen := 255; Temp := ''; SetLength(Name, NameLen); SetLength(Temp, TempLen); LookupAccountSidA(nil, SID, PAnsiChar(@Name[1]), NameLen, PAnsiChar(@Temp[1]), TempLen, SIDType); Name := StrPas(PChar(@Name[1])); Result := Name; end; |
in dieser zeile hattest du nen fehler -> warscheinlich weil du schnell schnell gemacht hast
Hattest "NAME" 2 mal stehen wo du warscheinlich "TEMP" reinmachen wolltest
Aber jetzt gehts!!!!
Delphi-Quelltext 1: 2: 3:
| LookupAccountSidA(nil, SID, PAnsiChar(@Name[1]), NameLen, PAnsiChar(@Name[1]), TempLen, SIDType);
LookupAccountSidA(nil, SID, PAnsiChar(@Name[1]), NameLen, PAnsiChar(@Temp[1]), TempLen, SIDType); |
Ich danke dir vielmals für deine hilfe!
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 01.03.06 20:09
Dann geb ich Dir zumindest den Hinweis: Der Source von Mir war nur zum Testen. Da ist nämlich noch
1. ein MemLeak drin ist (die SID wird nicht freigegeben)
2. keine Fehlercodes geprüft werden, was zu potenziellen Problemen führen wird
3. Der Source nur für den lokalen Rechner gilt.
Kannst Du das mal noch entsprechend Fixen?
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
fuba 
      
Beiträge: 125
Win7
D7 Ent.
|
Verfasst: Mi 01.03.06 20:38
jo werd sehen wie weit ich das kann ohne gleich wieder ne frage zu stellen 
|
|
fuba 
      
Beiträge: 125
Win7
D7 Ent.
|
Verfasst: Mi 01.03.06 22:53
BenBE hat folgendes geschrieben: | Dann geb ich Dir zumindest den Hinweis: Der Source von Mir war nur zum Testen. Da ist nämlich noch
1. ein MemLeak drin ist (die SID wird nicht freigegeben)
2. keine Fehlercodes geprüft werden, was zu potenziellen Problemen führen wird
3. Der Source nur für den lokalen Rechner gilt.
Kannst Du das mal noch entsprechend Fixen? |
ich raffs nich glaub ich :/
Hab zwar geschafft die SID freizugeben (is ja auch nich schwierig)
Delphi-Quelltext 1: 2:
| FreeMemory(Sid); Sid := nil; |
Aber ich schaffs einfach nicht die richtige Fehler-Überprüfung einzubauen
hab mir einige Routinen angesehen und auch versucht mehrere proceduren/functionen dafür zu verwenden
aber das einzige was dann passiert ist, das ding geht garnimma
Und das problem mit "Localen rechnern" bekomme ich auch net ganz gebacken, da ich ja bei den functionen nur immer EIN
Result zurückbekomme wobei ich hier 2 brauchen würde
Kanst du mir da vlt. auch noch helfen ?
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 01.03.06 23:15
Bei der WinAPI bekommst Du über das Funktionsergebnis den Erfolgsstatus zurück (geklappt, nicht geklappt).
Um nun den Fehler-Grund zu erfragen, gibt es die API-Funktion GetLastError (siehe MSDN), die Dir den Fehlergrund als Index liefert.
Wo hapert's denn?
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 01.03.06 23:36
Was macht die Funktion GetAdminTest? Get klingt, als wenn sie etwas ermittelt. Test aber wieder als wenn sie prüft, ob etwas zu trifft.  Fazit: Schlecht benannt.
So, habe mich mal eben hingesetzt und das so umgeschrieben, wie ich es gemacht hätte:
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:
|
function ConvertStringSidToSid(StringSid: PWideChar; var Sid: PSID): Boolean; stdcall; external 'advapi32.dll' name 'ConvertStringSidToSidW';
function StrSIDToName(const StrSID: Widestring; var Name: string; var SIDType: DWORD): Boolean; var SID : PSID; Buffer : PChar; NameLen, TempLen : Cardinal; err : Boolean; begin err := ConvertStringSIDToSID(PWideChar(StrSID), SID); if err then begin NameLen := 0; TempLen := 0; LookupAccountSidA(nil, SID, nil, NameLen, nil, TempLen, SIDType); GetMem(Buffer, NameLen); try err := LookupAccountSidA(nil, SID, Buffer, NameLen, nil, TempLen, SIDType); if err then SetString(Name, Buffer, Namelen); finally FreeMem(Buffer); end; end; if Assigned(SID) then LocalFree(Cardinal(SID)); result := err; end;
procedure TForm1.Button1Click(Sender: TObject); var Name : string; SIDType: DWORD; begin if StrSIDToName('S-1-5-32-544', Name, SIDType) then ShowMessage(Name) else ShowMessage(SysErrorMessage(GetLastError)); end; |
Die SID wird übrigens mit LocalFree freigegeben laut PSDK und nicht mit FreeMemory.  Und meine Funktion liefert True oder False zurück, damit der Caller überprüfen kann, ob alles geklappt hat oder nicht und dann entsprechen reagieren kann.
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Do 02.03.06 00:56
fuba hat folgendes geschrieben: | Hab zwar geschafft die SID freizugeben (is ja auch nich schwierig)
Delphi-Quelltext 1: 2:
| FreeMemory(Sid); Sid := nil; | |
Autsch.. SIDs werden ganz sicher nicht mit FreeMemory freigegeben, FreeMemory verwendet den Memory-Manager von Delphi! Das kann ganz leicht daneben gehen!
Wenn du mit APIs arbeitest (so wie hier), dann musst du sehr sorgfältig die Dokumentation (das PSDK) lesen und dort steht, dass die SID die mit ConvertStringSidToSid erzeugt wurde mit LocalFree freigegeben werden muss (wie Luckie schon geschrieben hat). Verwendest du hingegen AllocateAndInitializeSid (was in diesem Fall wahrscheinlich sogar angebrachter wäre), so musst du die SID mit FreeSid freigeben!
Gruß, Motzi
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 02.03.06 01:07
Gibt es sonst was auszusetzen an meiner Version? 
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Do 02.03.06 14:22
Luckie hat folgendes geschrieben: | Gibt es sonst was auszusetzen an meiner Version?  |
Ja, wenn ich den Namen err lese, denke ich, dass diese Variable einen Fehler anzeigt, False kein Fehler, True Fehler. Folglich würde deine Routine True bei einem Fehler zurückgeben.
Fazit: Schlechte Benennung *g*
Besser wäre es, die Variable Succ oder Suck zu nennen
Außerdem wird bei Dir, die Variable SID nicht mit NIL initialisiert, was aber bei lokalen Variablen gemacht werden sollte, wenn man diese mit Assigned prüfen möchte.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 02.03.06 14:34
OK, wird heute Abend nachgebessert. 
|
|
|