128 lines
3.4 KiB
C++
128 lines
3.4 KiB
C++
// Copyright (C) 1999 Microsoft Corporation
|
|
//
|
|
// Implementation of ICloneSecurityPrincipal::AddSidHistory
|
|
//
|
|
// sburns 5-3-99
|
|
|
|
|
|
|
|
#include "headers.hxx"
|
|
#include "resource.h"
|
|
#include "common.hpp"
|
|
#include "implmain.hpp"
|
|
|
|
|
|
|
|
HRESULT
|
|
CloneSecurityPrincipal::DoAddSidHistory(
|
|
const String& srcPrincipalSamName,
|
|
const String& dstPrincipalSamName,
|
|
long flags)
|
|
{
|
|
LOG_FUNCTION(CloneSecurityPrincipal::DoAddSidHistory);
|
|
|
|
if (srcPrincipalSamName.empty())
|
|
{
|
|
SetComError(IDS_MISSING_SRC_SAM_NAME);
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
if (flags)
|
|
{
|
|
// not used, should be 0
|
|
SetComError(IDS_FLAGS_ARE_UNUSED);
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
if (!connection || !connection->IsConnected())
|
|
{
|
|
SetComError(IDS_MUST_CONNECT_FIRST);
|
|
return Win32ToHresult(ERROR_ONLY_IF_CONNECTED);
|
|
};
|
|
|
|
// At this point, the Computer objects contain the normalized
|
|
// source and destination DC names, and their domains, and any
|
|
// necessary authenticated connections to those DCs have been
|
|
// established.
|
|
|
|
HRESULT hr = S_OK;
|
|
do
|
|
{
|
|
// use DNS names, if we have them
|
|
|
|
String srcDc = connection->srcDcDnsName;
|
|
String srcDomain = connection->srcComputer->GetDomainDnsName();
|
|
if (srcDomain.empty())
|
|
{
|
|
// source domain not win2k, so use netbios names.
|
|
srcDomain = connection->srcComputer->GetDomainNetbiosName();
|
|
srcDc = connection->srcComputer->GetNetbiosName();
|
|
}
|
|
|
|
// use a DNS domain name as the dest domain is NT 5
|
|
|
|
String dstDomain = connection->dstComputer->GetDomainDnsName();
|
|
|
|
// if dstPrincipalSamName is not specified, use srcPrincipalSamName
|
|
|
|
String dstSamName =
|
|
dstPrincipalSamName.empty()
|
|
? srcPrincipalSamName
|
|
: dstPrincipalSamName;
|
|
|
|
SEC_WINNT_AUTH_IDENTITY authInfo;
|
|
authInfo.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;
|
|
authInfo.User = 0;
|
|
authInfo.UserLength = 0;
|
|
authInfo.Domain = 0;
|
|
authInfo.DomainLength = 0;
|
|
authInfo.Password = 0;
|
|
authInfo.PasswordLength = 0;
|
|
|
|
LOG(L"Calling DsAddSidHistory");
|
|
LOG(String::format(L"Flags : %1!X!", 0));
|
|
LOG(String::format(L"SrcDomain : %1", srcDomain.c_str()));
|
|
LOG(String::format(L"SrcPrincipal : %1", srcPrincipalSamName.c_str()));
|
|
LOG(String::format(L"SrcDomainController : %1", srcDc.c_str()));
|
|
LOG(String::format(L"DstDomain : %1", dstDomain.c_str()));
|
|
LOG(String::format(L"DstPrincipal : %1", dstSamName.c_str()));
|
|
|
|
hr =
|
|
Win32ToHresult(
|
|
::DsAddSidHistory(
|
|
connection->dstDsBindHandle,
|
|
0, // unused
|
|
srcDomain.c_str(),
|
|
srcPrincipalSamName.c_str(),
|
|
srcDc.c_str(),
|
|
0, // &authInfo,
|
|
dstDomain.c_str(),
|
|
dstSamName.c_str()));
|
|
LOG_HRESULT(hr);
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
unsigned id = IDS_ADD_SID_HISTORY_FAILED;
|
|
if (hr == Win32ToHresult(ERROR_INVALID_HANDLE))
|
|
{
|
|
// this is typically due to misconfiguring the source dc
|
|
id = IDS_ADD_SID_HISTORY_FAILED_WITH_INVALID_HANDLE;
|
|
}
|
|
|
|
SetComError(
|
|
String::format(
|
|
id,
|
|
GetErrorMessage(hr).c_str()));
|
|
break;
|
|
}
|
|
}
|
|
while (0);
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
|
|
|