Autor Beitrag
fuba
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 125

Win7
D7 Ent.
BeitragVerfasst: 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 user profile iconraziel: Topic aus VCL (Visual Component Library) verschoben am Mi 01.03.2006 um 11:15
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 125

Win7
D7 Ent.
BeitragVerfasst: Mi 01.03.06 01:43 
äähhh :D

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 :D
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 125

Win7
D7 Ent.
BeitragVerfasst: Mi 01.03.06 18:55 
Ich denk mal ich bin schon nen schritt weiter...

habe das gefunden

ausblenden volle Höhe 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:
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 // using DWord instead of LPDWORD
  ) : Boolean;
var
 psia : PSIDIdentifierAuthority;
 dwSubAuthorities : DWORD;
 dwSidRev : DWORD;
 dwCounter : DWORD;
 dwSidSize : DWORD;
begin

  // delphi specific initialization
  dwSidRev := 1;        // assume 1
  Result := False;      // default return

  // Validate the binary SID.  return false if invalid
  if not IsValidSid (sid) then exit;

  // Get the identifier authority value from the SID.
  psia := GetSidIdentifierAuthority (sid);

  // Get the number of subauthorities in the SID.
  dwSubAuthorities := GetSidSubAuthorityCount(sid)^;

  // Compute the buffer length.
  // S-SID_REVISION- + IdentifierAuthority- +
  // subauthorities- + NULL
  dwSidSize := (15 + 12 + (12 * dwSubAuthorities)
  + 1) * SizeOf(Char);

  // Check input buffer length.
  // If too small, indicate the proper size
  // and set last error.
  if (dwBufferLen < dwSidSize) then
  begin
    dwBufferLen := dwSidSize;
    SetLastError(ERROR_INSUFFICIENT_BUFFER);
    Exit;
  end;

  // Add 'S' prefix and revision number to the string.
  TextualSid := Format ('S-%u-',
                [dwSidRev]);

  // Add SID identifier authority to the string.
  if (psia^.Value[0] <> 0or (psia^.Value[1] <> 0then
    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 [4shl 8) +
                      DWORD (psia^.Value [3shl 16) +
                      DWORD (psia^.Value [2shl 24)]);
    end;


// Add SID subauthorities to the string.
  for dwCounter := 0 to dwSubAuthorities - 1 do
    begin
      TextualSid := TextualSid +
                    Format ('-%u',
                    [GetSidSubAuthority (sid, dwCounter)^])
    end;

 Result := True;
end;         // function gettextualsid


aber wie bekomme ich die SID vom ConvertStringSidToSid zurück?

ausblenden 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 :D

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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 125

Win7
D7 Ent.
BeitragVerfasst: Mi 01.03.06 19:14 
habs mal mit result probiert, geht aber auch net :/

ausblenden 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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mi 01.03.06 19:18 
Ich hab Testweise folgenden Source probiert:

ausblenden 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; stdcallexternal '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'//Liefert 'VORDEFINIERT'
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 125

Win7
D7 Ent.
BeitragVerfasst: 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!!!

ausblenden 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 :D
Hattest "NAME" 2 mal stehen wo du warscheinlich "TEMP" reinmachen wolltest
Aber jetzt gehts!!!!

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 125

Win7
D7 Ent.
BeitragVerfasst: Mi 01.03.06 20:38 
jo werd sehen wie weit ich das kann ohne gleich wieder ne frage zu stellen :)
fuba Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 125

Win7
D7 Ent.
BeitragVerfasst: Mi 01.03.06 22:53 
user profile iconBenBE 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)
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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



BeitragVerfasst: 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. :gruebel: Fazit: Schlecht benannt. ;)

So, habe mich mal eben hingesetzt und das so umgeschrieben, wie ich es gemacht hätte:
ausblenden volle Höhe 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:
{
  Author  : Michael Puff - http://www.michael-puff.de
  Date    : 2006-03-01
  License : PUBLIC DOMAIN
}


function ConvertStringSidToSid(StringSid: PWideChar; var Sid: PSID): Boolean; stdcallexternal 'advapi32.dll' name
'ConvertStringSidToSidW';

function StrSIDToName(const StrSID: Widestring; var Name: stringvar 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Do 02.03.06 00:56 
user profile iconfuba hat folgendes geschrieben:
Hab zwar geschafft die SID freizugeben (is ja auch nich schwierig)
ausblenden 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



BeitragVerfasst: Do 02.03.06 01:07 
Gibt es sonst was auszusetzen an meiner Version? ;)
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 02.03.06 14:22 
user profile iconLuckie 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



BeitragVerfasst: Do 02.03.06 14:34 
OK, wird heute Abend nachgebessert. ;)