|
|
// 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; }
|