324 lines
8.4 KiB
C++
324 lines
8.4 KiB
C++
|
//#--------------------------------------------------------------
|
||
|
//
|
||
|
// File: sdoserverinfo.cpp
|
||
|
//
|
||
|
// Synopsis: Implementation of CSdoServerInfo class methods
|
||
|
//
|
||
|
//
|
||
|
// History: 06/04/98 MKarki Created
|
||
|
//
|
||
|
// Copyright (C) 1997-98 Microsoft Corporation
|
||
|
// All rights reserved.
|
||
|
//
|
||
|
//----------------------------------------------------------------
|
||
|
#include "stdafx.h"
|
||
|
#include "sdoserverinfo.h"
|
||
|
#include <activeds.h>
|
||
|
#include <security.h>
|
||
|
|
||
|
const DWORD MAX_DOMAINNAME_LENGTH = 1024;
|
||
|
|
||
|
//++--------------------------------------------------------------
|
||
|
//
|
||
|
// Function: CSdoServerInfo
|
||
|
//
|
||
|
// Synopsis: This is CSdoServerInfo Class constructor
|
||
|
//
|
||
|
// Arguments: NONE
|
||
|
//
|
||
|
// Returns: NONE
|
||
|
//
|
||
|
// History: MKarki Created 06/04/98
|
||
|
//
|
||
|
//----------------------------------------------------------------
|
||
|
CSdoServerInfo::CSdoServerInfo()
|
||
|
:m_bIsNT5 (false)
|
||
|
{
|
||
|
|
||
|
DWORD dwSize = sizeof (OSVERSIONINFO);
|
||
|
OSVERSIONINFO VersionInfo;
|
||
|
|
||
|
ZeroMemory (&VersionInfo, dwSize);
|
||
|
VersionInfo.dwOSVersionInfoSize = dwSize;
|
||
|
|
||
|
//
|
||
|
// find out which system type this is
|
||
|
//
|
||
|
m_bIsNT5 =
|
||
|
(GetVersionEx (&VersionInfo) && (5 == VersionInfo.dwMajorVersion));
|
||
|
|
||
|
} // end of CSdoServerInfo class constructor
|
||
|
|
||
|
//++--------------------------------------------------------------
|
||
|
//
|
||
|
// Function: ~CSdoServerInfo
|
||
|
//
|
||
|
// Synopsis: This is CSdoSeverInfo class destructor
|
||
|
//
|
||
|
// Arguments: NONE
|
||
|
//
|
||
|
// Returns: NONE
|
||
|
//
|
||
|
//
|
||
|
// History: MKarki Created 2/10/98
|
||
|
//
|
||
|
//----------------------------------------------------------------
|
||
|
CSdoServerInfo ::~CSdoServerInfo()
|
||
|
{
|
||
|
} // end of CSdoServerInfo class destructor
|
||
|
|
||
|
//++--------------------------------------------------------------
|
||
|
//
|
||
|
// Function: GetOSInfo
|
||
|
//
|
||
|
// Synopsis: This is GetOSInfo method of the
|
||
|
// ISdoServerInfo COM Interface.
|
||
|
//
|
||
|
// Arguments:
|
||
|
// [in] BSTR - Computer Name
|
||
|
// [out] PIASOSTYPE
|
||
|
//
|
||
|
// Returns: HRESULT - status
|
||
|
//
|
||
|
//
|
||
|
// History: MKarki Created 06/09/98
|
||
|
//
|
||
|
//----------------------------------------------------------------
|
||
|
HRESULT
|
||
|
CSdoServerInfo::GetOSInfo (
|
||
|
/*[in]*/ BSTR bstrServerName,
|
||
|
/*[out]*/ PIASOSTYPE pOSType
|
||
|
)
|
||
|
{
|
||
|
WCHAR szComputerName [MAX_COMPUTERNAME_LENGTH +1];
|
||
|
DWORD dwBufferSize = MAX_COMPUTERNAME_LENGTH +1;
|
||
|
DWORD dwErrorCode = ERROR_SUCCESS;
|
||
|
|
||
|
_ASSERT(NULL != pOSType);
|
||
|
if (NULL == pOSType)
|
||
|
{
|
||
|
IASTracePrintf(
|
||
|
"Error in Server Information SDO - GetOSInfo()"
|
||
|
" - invalid argument passed in"
|
||
|
);
|
||
|
return E_INVALIDARG;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// check if the user wants to get Info about local machine
|
||
|
//
|
||
|
if ( NULL == bstrServerName )
|
||
|
{
|
||
|
if ( FALSE == ::GetComputerName (szComputerName, &dwBufferSize))
|
||
|
{
|
||
|
dwErrorCode = GetLastError ();
|
||
|
IASTracePrintf(
|
||
|
"Error in Server Information SDO - GetOSInfo()"
|
||
|
"GetComputerName() failed with error: %d",
|
||
|
dwErrorCode
|
||
|
);
|
||
|
return (HRESULT_FROM_WIN32 (dwErrorCode));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
bstrServerName = szComputerName;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// call the IASSDO.DLL specific method to return the
|
||
|
// required information
|
||
|
//
|
||
|
return (::SdoGetOSInfo (bstrServerName, pOSType));
|
||
|
|
||
|
} // end of CSdoServerInfo::GetOSInfo method
|
||
|
|
||
|
//++--------------------------------------------------------------
|
||
|
//
|
||
|
// Function: GetDomainInfo
|
||
|
//
|
||
|
// Synopsis: This is the ISdoServerInfo Interface method.
|
||
|
//
|
||
|
// Arguments:
|
||
|
// [in] OBJECTTYPE
|
||
|
// [in] BSTR - Object Id
|
||
|
// [out] PDOMAINTYPE
|
||
|
//
|
||
|
// Returns: HRESULT - status
|
||
|
//
|
||
|
//
|
||
|
// History: MKarki Created 06/09/98
|
||
|
//
|
||
|
//----------------------------------------------------------------
|
||
|
HRESULT
|
||
|
CSdoServerInfo::GetDomainInfo (
|
||
|
/*[in]*/ OBJECTTYPE ObjectType,
|
||
|
/*[in]*/ BSTR bstrObjectId,
|
||
|
/*[out]*/ PIASDOMAINTYPE pDomainType
|
||
|
)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
WCHAR szDomainName[MAX_DOMAINNAME_LENGTH +1];
|
||
|
WCHAR szComputerName [MAX_COMPUTERNAME_LENGTH +1];
|
||
|
DWORD dwBufferSize = MAX_COMPUTERNAME_LENGTH +1;
|
||
|
|
||
|
_ASSERT (NULL != pDomainType);
|
||
|
|
||
|
if (NULL == pDomainType)
|
||
|
{
|
||
|
IASTracePrintf(
|
||
|
"Error in Server Information SDO - GetDomainInfo()"
|
||
|
" - invalid argument passed in (PIASDOMAINTYPE==NULL)"
|
||
|
);
|
||
|
return (E_INVALIDARG);
|
||
|
}
|
||
|
|
||
|
// for now we are not supporting this API if this is not
|
||
|
// a NT 5 machine
|
||
|
//
|
||
|
if ( false == m_bIsNT5 )
|
||
|
{
|
||
|
IASTracePrintf(
|
||
|
"Error in Server Information SDO - GetDomainInfo()"
|
||
|
" - Not an NT 5 machine..."
|
||
|
);
|
||
|
return (E_NOTIMPL);
|
||
|
}
|
||
|
|
||
|
switch (ObjectType)
|
||
|
{
|
||
|
|
||
|
case OBJECT_TYPE_COMPUTER:
|
||
|
|
||
|
//
|
||
|
// check if the user wants to get Info about local machine
|
||
|
//
|
||
|
if ( NULL == bstrObjectId)
|
||
|
{
|
||
|
if ( FALSE == ::GetComputerName (szComputerName, &dwBufferSize))
|
||
|
{
|
||
|
DWORD dwErrorCode = GetLastError ();
|
||
|
IASTracePrintf(
|
||
|
"Error in Server Information SDO - GetDomainInfo()"
|
||
|
"GetComputerName() failed with error: %d",
|
||
|
dwErrorCode
|
||
|
);
|
||
|
hr = HRESULT_FROM_WIN32 (dwErrorCode);
|
||
|
break;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
bstrObjectId = szComputerName;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// call the API to get the appropriate info
|
||
|
//
|
||
|
hr = ::SdoGetDomainInfo (
|
||
|
bstrObjectId,
|
||
|
NULL,
|
||
|
pDomainType
|
||
|
);
|
||
|
if (FAILED (hr))
|
||
|
{
|
||
|
IASTracePrintf(
|
||
|
"Error in Server Information SDO"
|
||
|
" - GetDomainInfo() - SetDomainInfo() failed:%x",
|
||
|
hr
|
||
|
);
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case OBJECT_TYPE_USER:
|
||
|
//
|
||
|
// get the domain name from the ADsPath
|
||
|
//
|
||
|
hr = GetDomainFromADsPath (bstrObjectId, szDomainName);
|
||
|
if (FAILED (hr))
|
||
|
{
|
||
|
IASTracePrintf(
|
||
|
"Error in Server Information SDO GetDomainInfo()"
|
||
|
" - GetDomainFromADsPath() failed with error:%x",
|
||
|
hr
|
||
|
);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
//
|
||
|
// call the API to get the appropriate info
|
||
|
//
|
||
|
hr = ::SdoGetDomainInfo (
|
||
|
NULL,
|
||
|
szDomainName,
|
||
|
pDomainType
|
||
|
);
|
||
|
if (FAILED (hr))
|
||
|
{
|
||
|
IASTracePrintf(
|
||
|
"Error in Server Information SDO - GetDomainInfo()"
|
||
|
" - SdoGetDomainInfo() failed with error:%x",
|
||
|
hr
|
||
|
);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
IASTracePrintf(
|
||
|
"Error in Server Information SDO - GetDomainInfo()"
|
||
|
" - Invalid object type:%d",
|
||
|
ObjectType
|
||
|
);
|
||
|
hr = E_INVALIDARG;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return (hr);
|
||
|
|
||
|
} // end of CSdoServerInfo::GetDomainInfo method
|
||
|
|
||
|
//++--------------------------------------------------------------
|
||
|
//
|
||
|
// Function: GetDomainFromADsPath
|
||
|
//
|
||
|
// Synopsis: This is the CSdoServerInfo class private method.
|
||
|
// used to convert a ADsPath to a Domain Name
|
||
|
//
|
||
|
// Arguments:
|
||
|
// [in] LPCWSTR - ADsPath
|
||
|
// [out] PWSTR - Domain Name
|
||
|
//
|
||
|
// Returns: HRESULT - status
|
||
|
//
|
||
|
//
|
||
|
// History: MKarki Created 06/09/98
|
||
|
//
|
||
|
//----------------------------------------------------------------
|
||
|
HRESULT
|
||
|
CSdoServerInfo::GetDomainFromADsPath (
|
||
|
/*[in]*/ LPCWSTR pObjectId,
|
||
|
/*[out]*/ LPWSTR pszDomainName
|
||
|
)
|
||
|
{
|
||
|
_ASSERT ((NULL != pObjectId) && (NULL != pszDomainName));
|
||
|
|
||
|
// copy the name to the buffer to be returned
|
||
|
//
|
||
|
wcscpy (pszDomainName, pObjectId);
|
||
|
|
||
|
PWCHAR pTemp = wcschr (pszDomainName, L'/');
|
||
|
if (NULL != pTemp)
|
||
|
{
|
||
|
//
|
||
|
// we only need the domain name part of the ADsPath
|
||
|
//
|
||
|
*pTemp = L'\0';
|
||
|
}
|
||
|
|
||
|
return (S_OK);
|
||
|
|
||
|
} // end of CSdoServerInfo::GetDomainFromADsPath method
|