Recupero del nome dell'account di dominio di un gruppo
Gli utenti, i gruppi, i computer e altre entità di sicurezza possono essere rappresentati in forma di account di dominio. L'account di dominio (il nome di accesso usato nelle versioni precedenti di Windows NT) ha il formato seguente:
<domain>\<account>
Dove "<domain>" è il nome del dominio Windows NT che contiene l'utente e "<account>" è la proprietà samAccountName dell'utente specificato. Ad esempio: "Fabrikam\jeffsmith".
Il modulo dell'account di dominio può specificare il trustee in un ace in un descrittore di sicurezza. Viene usato anche per il nome di accesso nei computer che eseguono Windows versione 4.0 e precedenti.
// 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, specify the domain to use as the
// domain name (such as liliput)
// or in dotted format (such as lilliput.Fabrikam.com).
HRESULT GetDownlevelName(LPOLESTR szDomainName, LPOLESTR szDN, LPOLESTR *ppNameString)
{
HRESULT hr = E_FAIL;
IADsNameTranslate *pNameTr = NULL;
IADs *pObject = NULL;
CComBSTR sbstrInitDomain = "";
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)
{
sbstrInitDomain = DomainControllerInfo->DomainName;
hr = S_OK;
}
// Free the buffer.
if (DomainControllerInfo)
NetApiBufferFree(DomainControllerInfo);
}
else
{
sbstrInitDomain = 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, sbstrInitDomain);
if (SUCCEEDED(hr))
{
CComBSTR sbstrNameTr;
hr = pNameTr->Set(ADS_NAME_TYPE_1779, CComBSTR(szDN));
hr = pNameTr->Get(ADS_NAME_TYPE_NT4, &sbstrNameTr);
if (SUCCEEDED(hr))
{
*ppNameString = (OLECHAR *)CoTaskMemAlloc (sizeof(OLECHAR)*(sbstrNameTr.Length() + 1));
if (*ppNameString)
wcscpy_s(*ppNameString, sbstrNameTr);
else
hr=E_FAIL;
}
}
pNameTr->Release();
}
}
// Caller must call CoTaskMemFree to free ppNameString.
return hr;
}