Leaked source code of windows server 2003
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.
 
 
 
 
 
 

192 lines
5.3 KiB

/*
**++
**
** Copyright (c) 2000-2002 Microsoft Corporation
**
**
** Module Name:
**
** secutil.cpp
**
** Abstract:
**
** Utility functions for the VSSEC test.
**
** Author:
**
** Adi Oltean [aoltean] 02/12/2002
**
**
** Revision History:
**
**--
*/
///////////////////////////////////////////////////////////////////////////////
// Includes
#include "sec.h"
///////////////////////////////////////////////////////////////////////////////
// Command line parsing
CVssSecurityTest::CVssSecurityTest()
{
CVssFunctionTracer ft(VSSDBG_VSSTEST, L"CVssSecurityTest::CVssSecurityTest()");
// Initialize data members
m_bCoInitializeSucceeded = false;
// Print display header
ft.Msg(L"\nVSS Security Test application, version 1.0\n");
}
CVssSecurityTest::~CVssSecurityTest()
{
// Unloading the COM library
if (m_bCoInitializeSucceeded)
CoUninitialize();
}
void CVssSecurityTest::Initialize()
{
CVssFunctionTracer ft(VSSDBG_VSSTEST, L"CVssSecurityTest::Initialize()");
ft.Msg (L"\n----------------- Command line parsing ---------------\n");
// Extract the executable name from the command line
LPWSTR wszCmdLine = GetCommandLine();
for(;iswspace(*wszCmdLine); wszCmdLine++);
if (*wszCmdLine == L'"') {
if (!wcschr(wszCmdLine+1, L'"'))
ft.Throw( VSSDBG_VSSTEST, E_UNEXPECTED, L"Invalid command line: %s\n", GetCommandLine() );
wszCmdLine = wcschr(wszCmdLine+1, L'"') + 1;
} else
for(;*wszCmdLine && !iswspace(*wszCmdLine); wszCmdLine++);
ft.Msg( L"Command line: '%s '\n", wszCmdLine );
// Parse command line
if (!ParseCmdLine(wszCmdLine))
throw(E_INVALIDARG);
PrintArguments();
BS_ASSERT(!IsOptionPresent(L"-D"));
ft.Msg (L"\n----------------- Initializing ---------------------\n");
// Initialize COM library
CHECK_COM(CoInitializeEx (NULL, COINIT_MULTITHREADED),;);
m_bCoInitializeSucceeded = true;
ft.Msg (L"COM library initialized.\n");
// Initialize COM security
CHECK_COM
(
CoInitializeSecurity
(
NULL, // IN PSECURITY_DESCRIPTOR pSecDesc,
-1, // IN LONG cAuthSvc,
NULL, // IN SOLE_AUTHENTICATION_SERVICE *asAuthSvc,
NULL, // IN void *pReserved1,
RPC_C_AUTHN_LEVEL_CONNECT, // IN DWORD dwAuthnLevel,
RPC_C_IMP_LEVEL_IDENTIFY, // IN DWORD dwImpLevel,
NULL, // IN void *pAuthList,
EOAC_NONE, // IN DWORD dwCapabilities,
NULL // IN void *pReserved3
)
,;);
ft.Msg (L"COM security initialized.\n");
// Turns off SEH exception handing for COM servers (BUG# 530092)
// ft.ComDisableSEH(VSSDBG_VSSTEST);
ft.Msg (L"COM SEH disabled.\n");
}
///////////////////////////////////////////////////////////////////////////////
// Utility functions
// Convert a failure type into a string
LPCWSTR CVssSecurityTest::GetStringFromFailureType( IN HRESULT hrStatus )
{
static WCHAR wszBuffer[MAX_TEXT_BUFFER];
switch (hrStatus)
{
VSS_ERROR_CASE(wszBuffer, MAX_TEXT_BUFFER, E_OUTOFMEMORY)
case NOERROR:
break;
default:
::FormatMessageW( FORMAT_MESSAGE_FROM_SYSTEM,
NULL, hrStatus, 0, wszBuffer, MAX_TEXT_BUFFER - 1, NULL);
break;
}
return (wszBuffer);
}
BOOL CVssSecurityTest::IsAdmin()
{
CVssFunctionTracer ft(VSSDBG_VSSTEST, L"CVssSecurityTest::IsAdmin()");
HANDLE hThreadToken = NULL;
CHECK_WIN32( OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, TRUE, &hThreadToken), ;);
DWORD cbToken = 0;
GetTokenInformation( hThreadToken, TokenUser, NULL, 0, &cbToken );
TOKEN_USER *pUserToken = (TOKEN_USER *)_alloca( cbToken );
CHECK_WIN32( GetTokenInformation( hThreadToken, TokenUser, pUserToken, cbToken, &cbToken ),
CloseHandle(hThreadToken);
);
WCHAR wszName[MAX_TEXT_BUFFER];
DWORD dwNameSize = MAX_TEXT_BUFFER;
WCHAR wszDomainName[MAX_TEXT_BUFFER];
DWORD dwDomainNameSize = MAX_TEXT_BUFFER;
SID_NAME_USE snUse;
CHECK_WIN32( LookupAccountSid( NULL, pUserToken->User.Sid,
wszName, &dwNameSize,
wszDomainName, &dwDomainNameSize,
&snUse),
CloseHandle(hThreadToken);
);
ft.Msg( L"* (ThreadToken) Name: %s, Domain Name: %s, SidUse: %d\n", wszName, wszDomainName, snUse );
SID_IDENTIFIER_AUTHORITY siaNtAuthority = SECURITY_NT_AUTHORITY;
PSID psid = 0;
CHECK_WIN32(
AllocateAndInitializeSid(
&siaNtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &psid ),
CloseHandle(hThreadToken);
);
BOOL bIsAdmin = FALSE;
CHECK_WIN32( CheckTokenMembership( 0, psid, &bIsAdmin ),
FreeSid( psid );
CloseHandle(hThreadToken);
);
FreeSid( psid );
CloseHandle(hThreadToken);
return bIsAdmin;
}