none
Wo benutzerübergreifend gemeinsame Konfigurationsdaten abspeichern RRS feed

  • Frage

  • Hi,

    wo speichere ich Daten, so dass diese nur einmal vorhanden sind
    und von jedem Benutzer aus gelesen/geschrieben werden können?

    Ich hatte ja gedacht, kein Problem: Einfach in CSIDL_COMMON_APPDATA
    speichern.
    Beispielprogramm:
    int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
    {
      TCHAR Filename[_MAX_PATH+1];
      if (GetSpecialFolder(CSIDL_COMMON_APPDATA, Filename))
      {
        _tcscat(Filename, _T("\\TestConfigData.inf"));
        HANDLE hFile= CreateFile(Filename, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
        if (hFile!=INVALID_HANDLE_VALUE)
        {
          MessageBox(nullptr, _T("ok"), _T("Info"), MB_ICONSTOP | MB_OK);
          CloseHandle(hFile);
        } else {
          MessageBox(nullptr, _T("failed"), _T("Info"), MB_ICONSTOP | MB_OK);
        }
      }
      return (int) 0;
    }

    Unter XP+W7 getestet.
    Als "Benutzer A" laufen -> Meldung "ok"
    Danach als "Benutzer B" laufen -> Meldung "failed"

    ps:
    Ich habe so etwas wie ein Installations-Programm dass bei Bedarf sich unter
    einem anderen Benutzeraccount neu startet. D.h. ich habe keine "ursprüngliche" Installation,
    die mir passende Ordner schaffen kann...

    Tschüß, Holger.

    Montag, 30. Juli 2012 13:23

Antworten

  • Der Ordner ist schon richtig. Es müssen noch die passenden Berechtigungen gesetzt werden.

    - Florian

    • Als Antwort markiert Holger Gothan Dienstag, 31. Juli 2012 07:58
    Dienstag, 31. Juli 2012 06:46

Alle Antworten

  • Der Ordner ist schon richtig. Es müssen noch die passenden Berechtigungen gesetzt werden.

    - Florian

    • Als Antwort markiert Holger Gothan Dienstag, 31. Juli 2012 07:58
    Dienstag, 31. Juli 2012 06:46
  • Hi,

    da ich recht lange gebraucht habe, um herauszufinden wie man
    den SECURITY_DESCRIPTOR für "jeder darf alles" herzustellen
    für das CreateFile, hier ein kurzes Beispiel (natürlich ohne
    Fehlerbehandlung etc.)

    SID_IDENTIFIER_AUTHORITY siaWorldSidAuthority = SECURITY_WORLD_SID_AUTHORITY;
    PSECURITY_DESCRIPTOR pSD = (PSECURITY_DESCRIPTOR)LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH);
    PACL pACL = (PACL)LocalAlloc(LPTR, 1024);

    InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION);
    InitializeAcl(pACL, 1024, ACL_REVISION);

    // das ist "Jeder"
    AllocateAndInitializeSid(&siaWorldSidAuthority, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &pSid)) return FALSE;

    // das ist "darf alles"
    DWORD AccessMaskAllow=FILE_GENERIC_READ | GENERIC_READ | FILE_GENERIC_WRITE | GENERIC_WRITE
      | FILE_GENERIC_EXECUTE | GENERIC_EXECUTE | FILE_DELETE_CHILD | DELETE
      | OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE;

    AddAccessAllowedAceEx(pACL, ACL_REVISION, OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE, AccessMaskAllow, pSid);

    SetSecurityDescriptorDacl(pSD, TRUE, pACL, FALSE);

    SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), pSD, TRUE};

    HANDLE hFile= CreateFile(Filename, GENERIC_READ | GENERIC_WRITE, 0, &sa, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

    Tschüß, Holger.

    Dienstag, 31. Juli 2012 09:02