You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
169 lines
4.2 KiB
169 lines
4.2 KiB
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Copyright (c) Microsoft Corporation
|
|
//
|
|
// SYNOPSIS
|
|
//
|
|
// Defines functions for loading and storing the database configuration.
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "nt.h"
|
|
#include "ntlsa.h"
|
|
#include "ntrtl.h"
|
|
#include "nturtl.h"
|
|
#include "windows.h"
|
|
#include "oaidl.h"
|
|
#include "dbconfig.h"
|
|
|
|
static const wchar_t privateKeyName[] = L"NetPolAccountingDbConfig";
|
|
|
|
|
|
HRESULT
|
|
WINAPI
|
|
IASLoadDatabaseConfig(
|
|
PCWSTR server,
|
|
BSTR* initString,
|
|
BSTR* dataSourceName
|
|
)
|
|
{
|
|
OBJECT_ATTRIBUTES objAttrs;
|
|
HANDLE lsa;
|
|
NTSTATUS status;
|
|
LSA_UNICODE_STRING keyName, systemName, *data;
|
|
BSTR bstr1, bstr2;
|
|
ULONG winError;
|
|
|
|
// Validate and initialize the out parameters.
|
|
if ((initString == 0) || (dataSourceName == 0))
|
|
{
|
|
return E_POINTER;
|
|
}
|
|
*initString = 0;
|
|
*dataSourceName = 0;
|
|
|
|
// Open a connection to the LSA.
|
|
RtlInitUnicodeString(&systemName, server);
|
|
InitializeObjectAttributes(&objAttrs, 0, 0, 0, 0);
|
|
status = LsaOpenPolicy(
|
|
&systemName,
|
|
&objAttrs,
|
|
POLICY_GET_PRIVATE_INFORMATION,
|
|
&lsa
|
|
);
|
|
if (NT_SUCCESS(status))
|
|
{
|
|
RtlInitUnicodeString(&keyName, privateKeyName);
|
|
|
|
// Retrieve the private data.
|
|
status = LsaRetrievePrivateData(lsa, &keyName, &data);
|
|
if (NT_SUCCESS(status) && (data != 0))
|
|
{
|
|
if (data->Length > 0)
|
|
{
|
|
// Data is two adjacent null-terminated strings.
|
|
bstr1 = SysAllocString(data->Buffer);
|
|
bstr2 = SysAllocString(data->Buffer + wcslen(data->Buffer) + 1);
|
|
|
|
if ((initString == 0) || (dataSourceName == 0))
|
|
{
|
|
SysFreeString(bstr1);
|
|
SysFreeString(bstr2);
|
|
status = STATUS_NO_MEMORY;
|
|
}
|
|
else
|
|
{
|
|
*initString = bstr1;
|
|
*dataSourceName = bstr2;
|
|
}
|
|
}
|
|
|
|
LsaFreeMemory(data);
|
|
}
|
|
else if (status == STATUS_OBJECT_NAME_NOT_FOUND)
|
|
{
|
|
status = STATUS_SUCCESS;
|
|
}
|
|
|
|
LsaClose(lsa);
|
|
}
|
|
|
|
winError = LsaNtStatusToWinError(status);
|
|
return HRESULT_FROM_WIN32(winError);
|
|
}
|
|
|
|
|
|
HRESULT
|
|
WINAPI
|
|
IASStoreDatabaseConfig(
|
|
PCWSTR server,
|
|
PCWSTR initString,
|
|
PCWSTR dataSourceName
|
|
)
|
|
{
|
|
LSA_UNICODE_STRING data, systemName, keyName;
|
|
size_t initStringLen, dataSourceNameLen, nbyte;
|
|
OBJECT_ATTRIBUTES objAttribs;
|
|
NTSTATUS status;
|
|
HANDLE lsa;
|
|
ULONG winError;
|
|
|
|
if ((initString != 0) && (dataSourceName != 0))
|
|
{
|
|
// Allocate memory to hold the data.
|
|
initStringLen = wcslen(initString) + 1;
|
|
dataSourceNameLen = wcslen(dataSourceName) + 1;
|
|
nbyte = (initStringLen + dataSourceNameLen) * sizeof(wchar_t);
|
|
|
|
data.Buffer = CoTaskMemAlloc(nbyte);
|
|
if (data.Buffer == 0)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
// Data is two adjacent null terminated strings.
|
|
memcpy(
|
|
data.Buffer,
|
|
initString,
|
|
(initStringLen * sizeof(wchar_t))
|
|
);
|
|
memcpy(
|
|
(data.Buffer + initStringLen),
|
|
dataSourceName,
|
|
(dataSourceNameLen * sizeof(wchar_t))
|
|
);
|
|
|
|
data.Length = (USHORT)nbyte;
|
|
data.MaximumLength = (USHORT)nbyte;
|
|
}
|
|
else
|
|
{
|
|
// Config is null, so just zero out the data.
|
|
data.Buffer = 0;
|
|
data.Length = 0;
|
|
data.MaximumLength = 0;
|
|
}
|
|
|
|
// Open a connection to the LSA.
|
|
RtlInitUnicodeString(&systemName, server);
|
|
InitializeObjectAttributes(&objAttribs, 0, 0, 0, 0);
|
|
status = LsaOpenPolicy(
|
|
&systemName,
|
|
&objAttribs,
|
|
POLICY_CREATE_SECRET,
|
|
&lsa
|
|
);
|
|
if (NT_SUCCESS(status))
|
|
{
|
|
RtlInitUnicodeString(&keyName, privateKeyName);
|
|
|
|
// Store the config.
|
|
status = LsaStorePrivateData(lsa, &keyName, &data);
|
|
LsaClose(lsa);
|
|
}
|
|
|
|
CoTaskMemFree(data.Buffer);
|
|
|
|
winError = LsaNtStatusToWinError(status);
|
|
return HRESULT_FROM_WIN32(winError);
|
|
}
|