/*++ 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 ); }