| Platform SDK: Active Directory, ADSI, and Directory Services |
Users, groups, computers, and other security principals can also be represented in domain account form. Domain account (the logon name used in previous versions of Windows NTŪ) has the following form:
domain\account
where domain is the name of the Windows NT domain that contains the user and account is the samAccountName property of the specified user. For example: Microsoft\jsmith.
The domain account form can be used to specify the trustee in an ACE in a security descriptor. It is also used for the logon name on computers running Windows version NT 4.0 and earlier.
//Need to include the following headers to use DsGetDcName
//#include <LMCONS.H>
//#include <dsgetdc.h>
//#include <lmapibuf.h>
//This function returns the previous version name of the security principal
//specified by the distinguished name specified by szDN.
//The szDomain parameter should be NULL to use the current domain
//to get the name translation. Otherwise, you should specify the
//domain you want to use as just the domain name (such as northwestdom)
//or in dotted format (such as northwestdom.Microsoft.com).
HRESULT GetDownlevelName(LPOLESTR szDomainName, LPOLESTR szDN, LPOLESTR *ppNameString)
{
HRESULT hr = E_FAIL;
IADsNameTranslate *pNameTr = NULL;
IADs *pObject = NULL;
LPOLESTR szPath = new OLECHAR[MAX_PATH];
LPOLESTR szInitDomain = new OLECHAR[MAX_PATH];
BSTR szNameTr;
if ((!szDN)||(!ppNameString))
return hr;
//Use the current domain if none is specified.
if (!szDomainName)
{
//Call DsGetDcName to get the name of this computer's domain.
PDOMAIN_CONTROLLER_INFO DomainControllerInfo = NULL;
DWORD dReturn = 0L;
dReturn = DsGetDcName( NULL,
NULL,
NULL,
NULL,
DS_DIRECTORY_SERVICE_REQUIRED,
&DomainControllerInfo
);
if (dReturn==NO_ERROR)
{
wcscpy(szInitDomain, DomainControllerInfo->DomainName);
hr = S_OK;
}
//Free the buffer.
if (DomainControllerInfo)
NetApiBufferFree(DomainControllerInfo);
}
else
{
wcscpy(szInitDomain, szDomainName);
hr = S_OK;
}
if (SUCCEEDED(hr))
{
//Create the COM object for the IADsNameTranslate object.
hr = CoCreateInstance(
CLSID_NameTranslate,
NULL,
CLSCTX_INPROC_SERVER,
IID_IADsNameTranslate,
(void **)&pNameTr
);
if (SUCCEEDED(hr))
{
//Initialize for the specified domain.
hr = pNameTr->Init(ADS_NAME_INITTYPE_DOMAIN, szInitDomain);
if (SUCCEEDED(hr))
{
hr = pNameTr->Set(ADS_NAME_TYPE_1779, szDN);
hr = pNameTr->Get(ADS_NAME_TYPE_NT4, &szNameTr);
if (SUCCEEDED(hr))
{
*ppNameString = (OLECHAR *)CoTaskMemAlloc (sizeof(OLECHAR)*(wcslen(szNameTr)+1));
if (*ppNameString)
wcscpy(*ppNameString, szNameTr);
else
hr=E_FAIL;
}
}
}
if (pNameTr)
pNameTr->Release();
}
//Caller must call CoTaskMemFree to free ppNameString.
return hr;
}