グループの Doメイン アカウント スタイルの名前を取得する
ユーザー、グループ、コンピューター、およびその他のセキュリティ プリンシパルは、doメイン アカウント フォームで表すことができます。 Doメイン アカウント (以前のバージョンの Windows NT で使用されるログオン名) の形式は次のとおりです。
<domain>\<account>
"<doメイン>" はユーザーを含む Windows NT doメイン の名前で、"<account>" は指定されたユーザーの samAccountName プロパティです。 例: "Fabrikam\jeffsmith"。
doメイン アカウント フォームでは、セキュリティ記述子の ACE でトラスティを指定できます。 また、Windows バージョン NT 4.0 以前を実行しているコンピューターのログオン名にも使用されます。
// 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;
}