/*++ 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 #include #include // // UNICODE or ANSI compilation // #include // // Windows Headers // #include #include // // C-Runtime Header // #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include 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(); }