Announcement

Collapse
No announcement yet.

TRegistry, SaveKey(), Registry Schlüssel sichern.

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • TRegistry, SaveKey(), Registry Schlüssel sichern.

    Guten Tag Leute,

    mit der TRegistry Methode

    bool __fastcall SaveKey(const AnsiString Key, const AnsiString FileName);

    habe ich ein Problem, nämlich: es wird einfach nichts in einer Datei gespeichert, obgleich ich die entsprechenden Prozeßprivilegien setze!

    Das Setzen der Prozeßprivilegien erfolgt in 3 Schritten mit den Windows API Funktionen

    OpenProcessToken()
    LookupPrivilegeValue() und
    AdjustTokenPrivileges()

    Alle 3 Funktionen geben einen Wert > 0 zurück, müßten also erfolgreich abgearbeitet worden sein. Es gelingt aber nicht, den Schlüssen mit seinen Unterschlüsseln und Werten in einer Datei zu sichern. Die Registry Methode SafeKey() gibt nach dem Aufruf immer "false" zurück! Es wurde zwar eine Datei "Test.sav" auf dem entsprechenden Directory erzeugt, diese ist aber leer!.
    <pre>
    bool __fastcall TOEBForm::StoreRegKey(void)
    {
    AnsiString Key;
    bool Flg = false;
    TOKEN_PRIVILEGES TokPriv;
    HANDLE hTok;

    if (!OpenProcessToken (GetCurrentProcess(),
    TOKEN_ADJUST_PRIVILEGES, &hTok))
    {
    if(!LookupPrivilegeValue(NULL, SE_BACKUP_NAME,
    &TokPriv.Privileges[0].Luid))
    {
    TokPriv.PrivilegeCount = 1;
    TokPriv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    if (!AdjustTokenPrivileges(hTok, FALSE, &TokPriv,
    sizeof(TOKEN_PRIVILEGES), NULL, NULL))
    {
    Reg->RootKey = HKEY_CURRENT_USER;
    Key = "Identities\\{C9880119-9A13-4487-91D8-1615083B4B19}"
    "\\Software\\Microsoft\\Internet Account Manager";

    if (Reg->KeyExists(Key))
    {
    if (FileExists("D:\\TestPfad\\Test.sav");
    DeleteFile("D:\\TestPfad\\Test.sav");

    // Sicherung des Schlüssels
    if (Reg->SaveKey(Key, "D:\\TestPfad\\Test.sav"))
    Flg = true;
    }
    }
    }
    }

    return Flg;
    }
    </pre>
    Kann mir jemand helfen? Was mache ich da falsch?

    Thaddaeus.

  • #2
    Habe das getestet und bei mir geht es so ebenfalls nicht.

    Versuch doch mal einen Schlüssel zu speichern, der ohne solches Konstrukt {C9880119-9A13-4487-91D8-1615083B4B19} auskommt.

    Wenn das geht, liegt es vermutlich daran. Ev. muss dieses {} aufgelöst werden?
    Christian

    Comment


    • #3
      Guten Tag Christian,

      daß die geschweiften Klammern Probleme bereiten kann ich mir nicht denken, da diese als Bestandteil des Original-Registryschlüssels, so wie angegeben, vorhanden sind. Läßt man die Klammern fort, so gibt die Methode KeyExists() false zurück!

      Es muß m.E. an den Privilegien liegen, aber an welchen?

      Thaddaeus

      Comment


      • #4
        Da meinte ich ein bisschen anders:

        Klar gibt es ohne die Klammern ein false, denn den Schlüssel gibt es ja nicht.

        Anderseits geht es, wenn du ein anderen Schlüssel ohne solche Klammern speichern willst.

        "...<b>einen Schlüssel</b> zu speichern, der ohne solches Konstrukt..."

        Also hat das schon was mit den Klammern zu tun, denn der Code innerhalb der Klammern verweist ja auf einen anderen Eintrag
        Christian

        Comment


        • #5
          Guten Tag Christian,

          Verzeihung, ich hatte Dich falsch verstanden! Das habe ich auch versucht, mit einem anderen Schlüssel, jedoch mit dem gleichen negativen Ergebnis - leider!

          Inzwischen bin ich aber - durch Zufall - dahinter gekommen, daß es nur an den Privilegien (bei XP prof.) liegt. Ich habe mittels RegEdit einerseits den Schlüssel problemlos in einer *.reg Datei (ASCII Text) speichern können. Will ich aber den gleichen Schlüssel mit dem RegEdit als Registrierungsstruktur-Datei *.* speichern, so klopft mir Windows XP auf die Finger! Bin ich jedoch als Administrator eingeloggt, geht alles glatt.

          Jetzt müßte ich nur wissen, welche Privilegien ich setzen muß, und wie das geht!

          Thaddaeus

          Comment


          • #6
            Na, Privilegien hast du ja schon oben gesetzt.

            Diese gibt es:
            <pre>
            #define SE_CREATE_TOKEN_NAME TEXT("SeCreateTokenPrivilege")
            #define SE_ASSIGNPRIMARYTOKEN_NAME TEXT("SeAssignPrimaryTokenPrivilege")
            #define SE_LOCK_MEMORY_NAME TEXT("SeLockMemoryPrivilege")
            #define SE_INCREASE_QUOTA_NAME TEXT("SeIncreaseQuotaPrivilege")
            #define SE_UNSOLICITED_INPUT_NAME TEXT("SeUnsolicitedInputPrivilege")
            #define SE_MACHINE_ACCOUNT_NAME TEXT("SeMachineAccountPrivilege")
            #define SE_TCB_NAME TEXT("SeTcbPrivilege")
            #define SE_SECURITY_NAME TEXT("SeSecurityPrivilege")
            #define SE_TAKE_OWNERSHIP_NAME TEXT("SeTakeOwnershipPrivilege")
            #define SE_LOAD_DRIVER_NAME TEXT("SeLoadDriverPrivilege")
            #define SE_SYSTEM_PROFILE_NAME TEXT("SeSystemProfilePrivilege")
            #define SE_SYSTEMTIME_NAME TEXT("SeSystemtimePrivilege")
            #define SE_PROF_SINGLE_PROCESS_NAME TEXT("SeProfileSingleProcessPrivilege")
            #define SE_INC_BASE_PRIORITY_NAME TEXT("SeIncreaseBasePriorityPrivilege")
            #define SE_CREATE_PAGEFILE_NAME TEXT("SeCreatePagefilePrivilege")
            #define SE_CREATE_PERMANENT_NAME TEXT("SeCreatePermanentPrivilege")
            #define SE_BACKUP_NAME TEXT("SeBackupPrivilege")
            #define SE_RESTORE_NAME TEXT("SeRestorePrivilege")
            #define SE_SHUTDOWN_NAME TEXT("SeShutdownPrivilege")
            #define SE_DEBUG_NAME TEXT("SeDebugPrivilege")
            #define SE_AUDIT_NAME TEXT("SeAuditPrivilege")
            #define SE_SYSTEM_ENVIRONMENT_NAME TEXT("SeSystemEnvironmentPrivilege")
            #define SE_CHANGE_NOTIFY_NAME TEXT("SeChangeNotifyPrivilege")
            #define SE_REMOTE_SHUTDOWN_NAME TEXT("SeRemoteShutdownPrivilege")
            #define SE_UNDOCK_NAME TEXT("SeUndockPrivilege")
            #define SE_SYNC_AGENT_NAME TEXT("SeSyncAgentPrivilege")
            #define SE_ENABLE_DELEGATION_NAME TEXT("SeEnableDelegationPrivilege")
            #define SE_MANAGE_VOLUME_NAME TEXT("SeManageVolumePrivilege")

            </pre>

            Tut mir leid, weiß auch nicht, welches dir jetzt Admin-Rechte gib
            Christian

            Comment


            • #7
              Guten Tag Christian,

              danke für Deine Mühe. Nun muß ich mich erst einmal durch diesen "Privilegiendschungel" durcharbeiten. Ich vermute, daß ich irgendeine Kombination aus einigen dieser Privilegien setzen muß. Wir werden sehen.

              Im Augenblick versuche ich das Problem mittels einer selbst entwickelten - noch unfertigen - Klasse, welche *.reg Dateien für beliebige Schlüssel erzeugt, das Problem zu umgehen.

              Thaddaeus

              Comment


              • #8
                Sollte diese fertig sein, hätte ich interesse an der Klasse

                Dank
                Christian

                Comment

                Working...
                X