You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
311 lines
7.7 KiB
311 lines
7.7 KiB
/*++
|
|
|
|
Copyright (c) 1997 Microsoft Corporation
|
|
|
|
Module Name:
|
|
frs.c
|
|
|
|
Abstract:
|
|
This module is a development tool. It exercises the dcpromo and poke
|
|
APIs.
|
|
|
|
Author:
|
|
Billy J. Fuller 12-Dec-1997
|
|
|
|
Environment
|
|
User mode winnt
|
|
|
|
--*/
|
|
|
|
#define FREE(_x_) { if (_x_) LocalFree(_x_); _x_ = NULL; }
|
|
#define WIN_SUCCESS(_x_) ((_x_) == ERROR_SUCCESS)
|
|
|
|
//
|
|
// Is a handle valid?
|
|
// Some functions set the handle to NULL and some to
|
|
// INVALID_HANDLE_VALUE (-1). This define handles both
|
|
// cases.
|
|
//
|
|
#define HANDLE_IS_VALID(_Handle) ((_Handle) && \
|
|
((_Handle) != INVALID_HANDLE_VALUE))
|
|
|
|
//
|
|
// NT Headers
|
|
//
|
|
#include <nt.h>
|
|
#include <ntrtl.h>
|
|
#include <nturtl.h>
|
|
|
|
//
|
|
// UNICODE or ANSI compilation
|
|
//
|
|
#include <tchar.h>
|
|
|
|
//
|
|
// Windows Headers
|
|
//
|
|
#include <windows.h>
|
|
#include <rpc.h>
|
|
|
|
|
|
//
|
|
// C-Runtime Header
|
|
//
|
|
#include <malloc.h>
|
|
#include <memory.h>
|
|
#include <process.h>
|
|
#include <signal.h>
|
|
#include <string.h>
|
|
#include <stddef.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <time.h>
|
|
#include <string.h>
|
|
#include <excpt.h>
|
|
#include <conio.h>
|
|
#include <sys\types.h>
|
|
#include <errno.h>
|
|
#include <sys\stat.h>
|
|
#include <ctype.h>
|
|
#include <winsvc.h>
|
|
|
|
|
|
DWORD
|
|
UtilGetTokenInformation(
|
|
IN HANDLE TokenHandle,
|
|
IN TOKEN_INFORMATION_CLASS TokenInformationClass,
|
|
IN DWORD InitialTokenBufSize,
|
|
OUT DWORD *OutTokenBufSize,
|
|
OUT PVOID *OutTokenBuf
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Retries GetTokenInformation() with larger buffers.
|
|
|
|
Arguments:
|
|
TokenHandle - From OpenCurrentProcess/Thread()
|
|
TokenInformationClass - E.g., TokenUser
|
|
InitialTokenBufSize - Initial buffer size; 0 = default
|
|
OutTokenBufSize - Resultant returned buf size
|
|
OutTokenBuf - free with with FrsFree()
|
|
|
|
|
|
Return Value:
|
|
|
|
OutTokenBufSize - Size of returned info (NOT THE BUFFER SIZE!)
|
|
OutTokenBuf - info of type TokenInformationClass. Free with FrsFree().
|
|
|
|
--*/
|
|
{
|
|
#undef DEBSUB
|
|
#define DEBSUB "UtilGetTokenInformation:"
|
|
DWORD WStatus;
|
|
|
|
*OutTokenBuf = NULL;
|
|
*OutTokenBufSize = 0;
|
|
|
|
//
|
|
// Check inputs
|
|
//
|
|
if (!HANDLE_IS_VALID(TokenHandle)) {
|
|
return ERROR_INVALID_PARAMETER;
|
|
}
|
|
|
|
if (InitialTokenBufSize == 0 ||
|
|
InitialTokenBufSize > (1024 * 1024)) {
|
|
InitialTokenBufSize = 1024;
|
|
}
|
|
|
|
//
|
|
// Retry if buffer is too small
|
|
//
|
|
*OutTokenBufSize = InitialTokenBufSize;
|
|
AGAIN:
|
|
*OutTokenBuf = LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT,
|
|
*OutTokenBufSize);
|
|
WStatus = ERROR_SUCCESS;
|
|
if (!GetTokenInformation(TokenHandle,
|
|
TokenInformationClass,
|
|
*OutTokenBuf,
|
|
*OutTokenBufSize,
|
|
OutTokenBufSize)) {
|
|
WStatus = GetLastError();
|
|
printf("GetTokenInformation(Info %d, Size %d); WStatus %d\n",
|
|
TokenInformationClass,
|
|
*OutTokenBufSize,
|
|
WStatus);
|
|
FREE(*OutTokenBuf);
|
|
if (WStatus == ERROR_INSUFFICIENT_BUFFER) {
|
|
goto AGAIN;
|
|
}
|
|
}
|
|
return WStatus;
|
|
}
|
|
|
|
|
|
VOID
|
|
PrintUserName(
|
|
VOID
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
Print our user name
|
|
|
|
Arguments:
|
|
None.
|
|
|
|
Return Value:
|
|
None.
|
|
--*/
|
|
{
|
|
WCHAR Uname[MAX_PATH + 1];
|
|
ULONG Unamesize = MAX_PATH + 1;
|
|
|
|
if (GetUserName(Uname, &Unamesize)) {
|
|
printf("User name is %ws\n", Uname);
|
|
} else {
|
|
printf("ERROR - Getting user name; WStatus %d\n",
|
|
GetLastError());
|
|
}
|
|
}
|
|
|
|
|
|
#define PRIV_BUF_LENGTH (1024)
|
|
VOID
|
|
PrintInfo(
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
Check if the caller is a member of Groups
|
|
|
|
Arguments:
|
|
ServerHandle
|
|
Groups
|
|
|
|
Return Value:
|
|
Win32 Status
|
|
--*/
|
|
{
|
|
DWORD i;
|
|
TOKEN_PRIVILEGES *Tp;
|
|
TOKEN_SOURCE *Ts;
|
|
DWORD ComputerLen;
|
|
WCHAR ComputerName[MAX_COMPUTERNAME_LENGTH + 1];
|
|
DWORD WStatus;
|
|
DWORD TokenBufSize;
|
|
PVOID TokenBuf = NULL;
|
|
HANDLE TokenHandle = NULL;
|
|
HANDLE IdHandle = NULL;
|
|
DWORD PrivLen;
|
|
WCHAR PrivName[MAX_PATH + 1];
|
|
CHAR SourceName[sizeof(Ts->SourceName) + 1];
|
|
|
|
ComputerLen = MAX_COMPUTERNAME_LENGTH;
|
|
ComputerName[0] = L'\0';
|
|
if (!GetComputerName(ComputerName, &ComputerLen)) {
|
|
printf("GetComputerName(); WStatus %d\n",
|
|
GetLastError());
|
|
return;
|
|
}
|
|
printf("Computer name is %ws\n", ComputerName);
|
|
PrintUserName();
|
|
|
|
//
|
|
// For this process
|
|
//
|
|
IdHandle = GetCurrentProcess();
|
|
if (!OpenProcessToken(IdHandle,
|
|
TOKEN_QUERY | TOKEN_QUERY_SOURCE,
|
|
&TokenHandle)) {
|
|
WStatus = GetLastError();
|
|
printf("Can't open process token; WStatus %d\n", WStatus);
|
|
goto CLEANUP;
|
|
}
|
|
|
|
//
|
|
// Get the Token privileges from the access token for this thread or process
|
|
//
|
|
WStatus = UtilGetTokenInformation(TokenHandle,
|
|
TokenPrivileges,
|
|
0,
|
|
&TokenBufSize,
|
|
&TokenBuf);
|
|
if (!WIN_SUCCESS(WStatus)) {
|
|
printf("UtilGetTokenInformation(TokenPrivileges); WStatus %d\n",
|
|
WStatus);
|
|
goto CLEANUP;
|
|
}
|
|
|
|
Tp = (TOKEN_PRIVILEGES *)TokenBuf;
|
|
for (i = 0; i < Tp->PrivilegeCount; ++i) {
|
|
PrivLen = MAX_PATH + 1;
|
|
if (!LookupPrivilegeName(NULL,
|
|
&Tp->Privileges[i].Luid,
|
|
PrivName,
|
|
&PrivLen)) {
|
|
printf("lookuppriv error %d\n", GetLastError());
|
|
exit(0);
|
|
}
|
|
printf("Priv %2d is %ws :%s:%s:%s:\n",
|
|
i,
|
|
PrivName,
|
|
(Tp->Privileges[i].Attributes & SE_PRIVILEGE_ENABLED_BY_DEFAULT) ? "Enabled by default" : "",
|
|
(Tp->Privileges[i].Attributes & SE_PRIVILEGE_ENABLED) ? "Enabled" : "",
|
|
(Tp->Privileges[i].Attributes & SE_PRIVILEGE_USED_FOR_ACCESS) ? "Used" : "");
|
|
}
|
|
FREE(TokenBuf);
|
|
|
|
//
|
|
// Source
|
|
//
|
|
//
|
|
// Get the Token privileges from the access token for this thread or process
|
|
//
|
|
WStatus = UtilGetTokenInformation(TokenHandle,
|
|
TokenSource,
|
|
0,
|
|
&TokenBufSize,
|
|
&TokenBuf);
|
|
if (!WIN_SUCCESS(WStatus)) {
|
|
printf("UtilGetTokenInformation(TokenSource); WStatus %d\n",
|
|
WStatus);
|
|
goto CLEANUP;
|
|
}
|
|
Ts = (TOKEN_SOURCE *)TokenBuf;
|
|
CopyMemory(SourceName, Ts->SourceName, sizeof(Ts->SourceName));
|
|
SourceName[sizeof(Ts->SourceName)] = '\0';
|
|
printf("Source: %s\n", SourceName);
|
|
FREE(TokenBuf);
|
|
|
|
CLEANUP:
|
|
if (HANDLE_IS_VALID(TokenHandle)) {
|
|
CloseHandle(TokenHandle);
|
|
}
|
|
if (HANDLE_IS_VALID(IdHandle)) {
|
|
CloseHandle(IdHandle);
|
|
}
|
|
FREE(TokenBuf);
|
|
}
|
|
|
|
|
|
VOID _cdecl
|
|
main(
|
|
IN DWORD argc,
|
|
IN PCHAR *argv
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
Process the command line.
|
|
|
|
Arguments:
|
|
argc
|
|
argv
|
|
|
|
Return Value:
|
|
Exits with 0 if everything went okay. Otherwise, 1.
|
|
--*/
|
|
{
|
|
PrintInfo();
|
|
}
|