AdjustTokenPrivileges gibt Fehlercode 1300 zurück



  • ERROR_NOT_ALL_ASSIGNED wird ausgegeben, wenn ich den Code hier ausführe:

    #include <windows.h>
    #include <iostream>
    
    int main()
    {
       HANDLE hToken; 
       TOKEN_PRIVILEGES tkp; 
       _SYSTEMTIME stp;
    
       stp.wYear = 1999;
    
       if (!OpenProcessToken(GetCurrentProcess(), 
            TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 
          return( FALSE ); 
    
       LookupPrivilegeValue(NULL, SE_SYSTEMTIME_NAME, 
            &tkp.Privileges[0].Luid); 
    
       tkp.PrivilegeCount = 1;    
       tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
    
       AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, 
            (PTOKEN_PRIVILEGES)NULL, 0); 
    
       if (GetLastError() != ERROR_SUCCESS) 
          return FALSE; 
    
       if (!SetSystemTime(&stp)) 
          return FALSE; 
    
       return TRUE;
    }
    

    Wieso funktioniert das nicht?



  • http://lmgtfy.com/?q=ERROR_NOT_ALL_ASSIGNED

    skullyan schrieb:

    _SYSTEMTIME
    

    skullyan schrieb:

    return( FALSE );
    

    skullyan schrieb:

    (PTOKEN_PRIVILEGES)NULL
    

    LölliPöp



  • LolliPop schrieb:

    http://lmgtfy.com/?q=ERROR_NOT_ALL_ASSIGNED

    skullyan schrieb:

    _SYSTEMTIME
    

    skullyan schrieb:

    return( FALSE );
    

    skullyan schrieb:

    (PTOKEN_PRIVILEGES)NULL
    

    LölliPöp

    Hm?



  • Link nicht geklicks0rt?



  • LölliPöp schrieb:

    Link nicht geklicks0rt?

    Doch, hat aber nicht geholf0rt. 😃
    Ich komm irgendwie nicht klar, kannst du mir zeigen, wie man das löst?



  • Selbst wenn ich TOKEN_ALL_ACCESS benutze, funktioniert das einfach nicht.



  • MSDN schrieb:

    ERROR_NOT_ALL_ASSIGNED
    The token does not have one or more of the privileges specified in the NewState parameter. The function may succeed with this error value even if no privileges were adjusted. The PreviousState parameter indicates the privileges that were adjusted.

    AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), 0, 0);
    ...
    


  • evilissimo schrieb:

    MSDN schrieb:

    ERROR_NOT_ALL_ASSIGNED
    The token does not have one or more of the privileges specified in the NewState parameter. The function may succeed with this error value even if no privileges were adjusted. The PreviousState parameter indicates the privileges that were adjusted.

    AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), 0, 0);
    ...
    

    So:

    #include <windows.h>
    #include <iostream>
    
    int main()
    {
       HANDLE hToken;
       TOKEN_PRIVILEGES tkp;
       _SYSTEMTIME stp;
    
       stp.wYear = 1999;
    
       if (!OpenProcessToken(GetCurrentProcess(),
            TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) // SELBST WENN ICH HIER TOKEN_ALL_ACCESS VERWENDE, BRINGT DAS NICHTS
          return( FALSE );
    
       LookupPrivilegeValue(NULL, SE_SYSTEMTIME_NAME,
            &tkp.Privileges[0].Luid);
    
       tkp.PrivilegeCount = 1;    
       tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    
    AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), 0, 0); // ERROR 1300 WARUM????
    
       if (GetLastError() != ERROR_SUCCESS)
    
          return FALSE;
    
       if (!SetSystemTime(&stp))
          return FALSE;
    
       return TRUE;
    }
    

    Ich bekomme denselben Fehler. Langsam verzweifle ich dran.



  • Man das nervt mich ∞mal



  • "BufferLength" muss nicht angegeben werden, wenn "PreviousState" 0 ist.
    Und:

    MSDN schrieb:

    The AdjustTokenPrivileges function cannot add new privileges to the access token. It can only enable or disable the token's existing privileges. To determine the token's privileges, call the GetTokenInformation function.

    Also schau erstmal, ob das Privileg überhaupt existiert.

    Und bist du im Adminaccount?

    http://technet.microsoft.com/en-us/library/bb456992.aspx
    http://technet.microsoft.com/en-us/library/bb457125.aspx



  • LolliPop schrieb:

    "BufferLength" muss nicht angegeben werden, wenn "PreviousState" 0 ist.
    Und:

    MSDN schrieb:

    The AdjustTokenPrivileges function cannot add new privileges to the access token. It can only enable or disable the token's existing privileges. To determine the token's privileges, call the GetTokenInformation function.

    Also schau erstmal, ob das Privileg überhaupt existiert.

    Und bist du im Adminaccount?

    http://technet.microsoft.com/en-us/library/bb456992.aspx
    http://technet.microsoft.com/en-us/library/bb457125.aspx

    Ok, aber ich sehe echt nicht, wo mein Fehler liegt. Mit SE_SHUTDOWN_NAME funktioniert derselbe Code einwandfrei.



  • Kann mir keiner helfen?

    Mich stört dieses Problem sehr.........



  • Er hat dir den grund gesagt. Dein Account mit dem du den test durchführst hat die verlangten privilegien nicht.
    Auf was für einem OS testest du?



  • evilissimo schrieb:

    Er hat dir den grund gesagt. Dein Account mit dem du den test durchführst hat die verlangten privilegien nicht.
    Auf was für einem OS testest du?

    Windows 7. Kann ich die Privilegien nicht bekommen?



  • Starte deine Anwendung als Administrator.

    Du hast 2 Möglichkeiten:

    1. Erstelle ein Manifest welches dir automatisch die Administratorenrechte gibt (Mit Zustimmung des Benutzers)
    2. Überprüfe zur Laufzeit ob du Administratorenrechte hast und wenn nicht kannst du dich über den "Run As" Dialog mit Administratorenrechten neustarten.

    Eigentlich gibt es noch eine Möglichkeit, aber von der Möchte ich abraten: UAC abschalten. Abraten weil du dir damit ein Sicherheitsloch in System reißt. Es hat schon seine Gründe warum es das UAC gibt und wenn man seine Anwendung sauber implementiert dann schadet das auch nicht weiter.

    Gruß,



  • evilissimo schrieb:

    Starte deine Anwendung als Administrator.

    Du hast 2 Möglichkeiten:

    1. Erstelle ein Manifest welches dir automatisch die Administratorenrechte gibt (Mit Zustimmung des Benutzers)
    2. Überprüfe zur Laufzeit ob du Administratorenrechte hast und wenn nicht kannst du dich über den "Run As" Dialog mit Administratorenrechten neustarten.

    Eigentlich gibt es noch eine Möglichkeit, aber von der Möchte ich abraten: UAC abschalten. Abraten weil du dir damit ein Sicherheitsloch in System reißt. Es hat schon seine Gründe warum es das UAC gibt und wenn man seine Anwendung sauber implementiert dann schadet das auch nicht weiter.

    Gruß,

    Naja, es beruhigt mich, dass es wenigstens nicht an mir liegt, dass das nicht funktioniert...

    Eine Frage habe ich aber noch: Wieso funktioniert das mit SE_SHUTDOWN_NAME ohne Manifest?

    Ich dachte immer, dass diese Privilegien dafür da sind, dass die UAC "zufrieden" ist..



  • #include <windows.h>
    
    int main()
    {
       HANDLE hToken; 
       TOKEN_PRIVILEGES tkp; 
    
       if (!OpenProcessToken(GetCurrentProcess(), 
            TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 
          return( FALSE ); 
    
       LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, 
            &tkp.Privileges[0].Luid); 
    
       tkp.PrivilegeCount = 1;    
       tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
    
       AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, 
            (PTOKEN_PRIVILEGES)NULL, 0); 
    
       if (GetLastError() != ERROR_SUCCESS) 
          return FALSE; 
    
       if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0)) 
          return FALSE; 
    
       return TRUE;
    
    }
    

    Das funktioniert nämlich auch, ohne dass die UAC ausgeschaltet wird... Merkwürdig...



  • Du musst doch keinen UAC dialog bedienen wenn du den Computer ausschalten willst 😉

    Wenn du aber das Datum oder die Uhrzeit ändern willst dann schon.



  • evilissimo schrieb:

    Du musst doch keinen UAC dialog bedienen wenn du den Computer ausschalten willst 😉

    Wenn du aber das Datum oder die Uhrzeit ändern willst dann schon.

    Ok 🙂

    Heißt das, ansonsten habe ich alles richtig gemacht?


Log in to reply