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.
273 lines
5.5 KiB
273 lines
5.5 KiB
/*++
|
|
|
|
Copyright (c) 1997 Microsoft Corporation
|
|
© 1998 Seagate Software, Inc. All rights reserved
|
|
|
|
Module Name:
|
|
|
|
WsbAccnt.cpp
|
|
|
|
Abstract:
|
|
|
|
This is the implementation of account helper functions.
|
|
|
|
Author:
|
|
|
|
Rohde Wakefield [rohde] 10-Apr-1997
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
|
|
#include "stdafx.h"
|
|
#include "lm.h"
|
|
|
|
|
|
|
|
HRESULT
|
|
WsbGetAccountDomainName(
|
|
OLECHAR * szDomainName,
|
|
DWORD cSize
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine is called to find out what domain the current process's
|
|
account belongs to. An array of cSize wide chars is required.
|
|
This is recommended to be MAX_COMPUTERNAMELENGTH.
|
|
|
|
Arguments:
|
|
|
|
hInst - HINSTANCE of this dll.
|
|
|
|
ulReason - Context of the attaching/detaching
|
|
|
|
Return Value:
|
|
|
|
S_OK - Success
|
|
|
|
E_* - Problem occured, error passed down.
|
|
|
|
--*/
|
|
{
|
|
HRESULT hr = S_OK;
|
|
HANDLE hToken = 0;
|
|
|
|
try {
|
|
|
|
if( !OpenThreadToken( GetCurrentThread(), TOKEN_QUERY, TRUE, &hToken ) ) {
|
|
|
|
//
|
|
// Ensure failure was because no token existed
|
|
//
|
|
|
|
WsbAffirm( GetLastError() == ERROR_NO_TOKEN, E_FAIL );
|
|
|
|
//
|
|
// attempt to open the process token, since no thread token
|
|
// exists
|
|
//
|
|
|
|
WsbAffirmStatus( OpenProcessToken( GetCurrentProcess(), TOKEN_QUERY, &hToken ) );
|
|
|
|
}
|
|
|
|
DWORD dw;
|
|
BYTE buf[ 512 ];
|
|
TOKEN_USER * pTokenUser = (TOKEN_USER*)buf;
|
|
WsbAffirmStatus( GetTokenInformation( hToken, TokenUser, buf, 512, &dw ) );
|
|
|
|
WCHAR szName[ 256 ];
|
|
DWORD cName = 256;
|
|
DWORD cDomain = cSize;
|
|
SID_NAME_USE snu;
|
|
WsbAffirmStatus( LookupAccountSid( 0, pTokenUser->User.Sid, szName, &cName, szDomainName, &cDomain, &snu ) );
|
|
|
|
} WsbCatch( hr );
|
|
|
|
if( hToken ) {
|
|
|
|
CloseHandle( hToken );
|
|
|
|
}
|
|
|
|
return( hr );
|
|
}
|
|
|
|
HRESULT
|
|
WsbGetServiceInfo(
|
|
IN GUID guidApp,
|
|
OUT OLECHAR ** pszServiceName, OPTIONAL
|
|
OUT OLECHAR ** pszAccountName OPTIONAL
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This function retrieves the name of the service, as well as the
|
|
account a COM service runs under. The returned strings are
|
|
WsbAlloc'd so they must be freed by the caller.
|
|
|
|
Arguments:
|
|
|
|
guidApp - app id of the service to get the account of.
|
|
|
|
pszServiceName - the name of the service.
|
|
|
|
pszAccountName - the full account name to set on the account.
|
|
|
|
Return Value:
|
|
|
|
S_OK - Success
|
|
|
|
E_* - Problem occured, error passed down.
|
|
|
|
--*/
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
|
|
try {
|
|
|
|
CWsbStringPtr serviceName;
|
|
CWsbStringPtr accountName;
|
|
|
|
if( pszServiceName ) *pszServiceName = 0;
|
|
if( pszAccountName ) *pszAccountName = 0;
|
|
|
|
//
|
|
// Find the service in the registry
|
|
//
|
|
|
|
CWsbStringPtr regPath = L"SOFTWARE\\Classes\\AppID\\";
|
|
regPath.Append( CWsbStringPtr( guidApp ) );
|
|
|
|
//
|
|
// Get the name of the service
|
|
//
|
|
|
|
if( pszServiceName ) {
|
|
|
|
serviceName.Realloc( 255 );
|
|
WsbAffirmHr( WsbGetRegistryValueString( 0, regPath, L"LocalService", serviceName, 255, 0 ) );
|
|
|
|
}
|
|
|
|
//
|
|
// Get the account for it to run under
|
|
//
|
|
|
|
if( pszAccountName ) {
|
|
|
|
accountName.Realloc( 255 );
|
|
hr = WsbGetRegistryValueString( 0, regPath, L"RunAs", accountName, 255, 0 ) ;
|
|
|
|
if( HRESULT_FROM_WIN32( ERROR_FILE_NOT_FOUND ) == hr ) {
|
|
|
|
WsbGetLocalSystemName( accountName );
|
|
hr = S_OK;
|
|
|
|
} else {
|
|
|
|
WsbAffirmHr( hr );
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
//
|
|
// Wait till end to do final assignments in case error
|
|
// occurs, in which case smart pointers automatically
|
|
// cleanup for us, and OUT params are not set.
|
|
//
|
|
|
|
if( pszServiceName ) serviceName.GiveTo( pszServiceName );
|
|
if( pszAccountName ) accountName.GiveTo( pszAccountName );
|
|
|
|
} WsbCatch( hr );
|
|
|
|
return( hr );
|
|
}
|
|
|
|
|
|
HRESULT
|
|
WsbGetComputerName(
|
|
OUT CWsbStringPtr & String
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine retrieves the name of the computer into a CWsbStringPtr.
|
|
|
|
Arguments:
|
|
|
|
String - String object to fill in with the name.
|
|
|
|
Return Value:
|
|
|
|
S_OK - Success
|
|
|
|
E_* - Problem occured, error passed down.
|
|
|
|
--*/
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
try {
|
|
|
|
//
|
|
// Force allocation of enough characters and call Win32
|
|
//
|
|
|
|
DWORD cbName = MAX_COMPUTERNAME_LENGTH + 1;
|
|
WsbAffirmHr( String.Realloc( cbName ) );
|
|
WsbAffirmStatus( GetComputerName( String, &cbName ) );
|
|
|
|
} WsbCatch( hr );
|
|
|
|
return( hr );
|
|
}
|
|
|
|
|
|
HRESULT
|
|
WsbGetLocalSystemName(
|
|
OUT CWsbStringPtr & String
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine retrieves the name of the account for LocalSystem.
|
|
|
|
Arguments:
|
|
|
|
String - String object to fill in with the name.
|
|
|
|
Return Value:
|
|
|
|
S_OK - Success
|
|
|
|
E_* - Problem occured, error passed down.
|
|
|
|
--*/
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
try {
|
|
|
|
//
|
|
// For now, hardcode. May need to lookup name of
|
|
// SECURITY_LOCAL_SYSTEM_RID
|
|
//
|
|
|
|
String = L"LocalSystem";
|
|
|
|
} WsbCatch( hr );
|
|
|
|
return( hr );
|
|
}
|
|
|