#include #include #include #include BOOL EnableCreatePermanentPrivilege( HANDLE TokenHandle, PTOKEN_PRIVILEGES OldPrivileges ); BOOL OpenToken( PHANDLE TokenHandle ); VOID __cdecl main (int argc, char *argv[]) { int i; PACL Dacl; LPSTR FileName; TOKEN_PRIVILEGES OldPrivileges; SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY; PSID AdminAliasSid; BOOL Result; ULONG DaclSize; HANDLE TokenHandle; SECURITY_DESCRIPTOR SecurityDescriptor; Result = OpenToken( &TokenHandle ); if ( !Result ) { printf("Unable to open token\n"); exit(-1); } Result = EnableCreatePermanentPrivilege( TokenHandle, &OldPrivileges ); if ( !Result ) { // // This account doesn't have SeCreatePermanent // privilege. Tell them to try running it again // from an account that does. // printf("Unable to enable SeCreatePermanent privilege\n"); // // do what you want here... // exit(4); } // // Display privileges. // // // Put things back the way they were // (VOID) AdjustTokenPrivileges ( TokenHandle, FALSE, &OldPrivileges, sizeof( TOKEN_PRIVILEGES ), NULL, NULL ); if ( GetLastError() != NO_ERROR ) { // // This is unlikely to happen, // printf("AdjustTokenPrivileges failed turning off SeCreatePermanent privilege\n"); } } BOOL EnableCreatePermanentPrivilege( HANDLE TokenHandle, PTOKEN_PRIVILEGES OldPrivileges ) { TOKEN_PRIVILEGES NewPrivileges; BOOL Result; LUID CreatePermanentValue; ULONG ReturnLength; // // Mike: change SeCreatePermanentPrivilege to SeCreatePermanentPrivilege // and you'll be pretty much there. // Result = LookupPrivilegeValue( NULL, "SeCreatePermanetPrivilegePrivilege", &CreatePermanentValue ); if ( !Result ) { printf("Unable to obtain value of CreatePermanent privilege\n"); return FALSE; } // // Set up the privilege set we will need // NewPrivileges.PrivilegeCount = 1; NewPrivileges.Privileges[0].Luid = CreatePermanentValue; NewPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; (VOID) AdjustTokenPrivileges ( TokenHandle, FALSE, &NewPrivileges, sizeof( TOKEN_PRIVILEGES ), OldPrivileges, &ReturnLength ); if ( GetLastError() != NO_ERROR ) { return( FALSE ); } else { return( TRUE ); } } BOOL OpenToken( PHANDLE TokenHandle ) { HANDLE Process; BOOL Result; Process = OpenProcess( PROCESS_QUERY_INFORMATION, FALSE, GetCurrentProcessId() ); if ( Process == NULL ) { // // This can happen, but is unlikely. // return( FALSE ); } Result = OpenProcessToken ( Process, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, TokenHandle ); CloseHandle( Process ); if ( !Result ) { // // This can happen, but is unlikely. // return( FALSE ); } return( TRUE ); }