LookupAccountName API - woher man den Namen bekommt


Thomas Wölfer
Thomas Wölfer

15. Januar 2008


Es gibt einige "bekannte" (well-Known) SIDs - so zum Beispiel die der Gruppe "Jeder" (Jedermann, Everyone, World). Nun ist es so, das man für verschiedene APIs, so zum Beispiel LookupAccountName den zum SID passenden String benötigt. Also eben "jeder". Dummerweise sind diese Strings aber solche, die lokalisiert werden: Bei unterschiedlichen Sprachversionen von Windows, muss man da auch den zur Sprache passenden String übergeben. Mit anderen Worten: "everyone" funktioniert eben nicht "einfach so".

Nun ist es deutlich schwieriger an diesen String zu gelangen, als man meinen möchte. Im Prinzip gibt es zwar die API LookupAccountSid die trotz Ihres Namens nicht die SID zu einem Account, sondern den Account-Name (und die Domäne) zu einer SID liefert. Die ist aber ein bisschen schwer zu bestücken. Wer aber auch einmal das Problem hat, den übersetzten Namen für einen "well known" SID zu brauchen, der kann mit folgendem Beispielcode vielleicht etwas schneller zu Ziel kommen: Hier wird (ohne jegliche Fehlerbehandlung) der Name der "Everyone" Gruppe ermittelt. Viel Vergnügen damit. :-)

class EveryoneGroup
{
public:
 EveryoneGroup()
 {
  PSID pEveryoneSID = NULL;
  SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY;

  if(AllocateAndInitializeSid(&SIDAuthWorld, 1,
       SECURITY_WORLD_RID,
       0, 0, 0, 0, 0, 0, 0,
       &pEveryoneSID))
  {
   SID_NAME_USE snu;
   char *name = 0;
   char *domain = 0;
   unsigned long namesize = 0;
   unsigned long domainsize = 0;

   LookupAccountSid(0, pEveryoneSID, name, &namesize, domain, &domainsize, &snu);
 
   int ret = GetLastError();
   if (ret == ERROR_INSUFFICIENT_BUFFER)
   {
    name = (char *) HeapAlloc(GetProcessHeap(), 0, namesize);
    if( name)
    {
     domain = (char *) HeapAlloc(GetProcessHeap(), 0, domainsize);
     if( domain)
     {
      if ( LookupAccountSid(0, pEveryoneSID, name, &namesize, domain, &domainsize, &snu))
      {
       groupName = name;
          HeapFree( GetProcessHeap(), 0, domain);
          HeapFree( GetProcessHeap(), 0, name);
          FreeSid( pEveryoneSID);
      }
     }
    }
   }
  }
 }
  
 CString Name()
    {
  return groupName;
 }
  
private:
 CString groupName;

};