201 lines
3.5 KiB
C
201 lines
3.5 KiB
C
|
#include <windows.h>
|
||
|
#include <malloc.h>
|
||
|
#include <stdio.h>
|
||
|
#include <process.h>
|
||
|
|
||
|
|
||
|
|
||
|
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 );
|
||
|
}
|
||
|
|