208 lines
4.3 KiB
C
208 lines
4.3 KiB
C
/*++
|
||
|
||
Copyright (c) 1998 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
modify.c
|
||
|
||
Abstract:
|
||
|
||
This is for modifying boot.ini and DS entries
|
||
|
||
Author:
|
||
|
||
Sean Selitrennikoff - 5/4/98
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
|
||
#include "precomp.h"
|
||
#pragma hdrstop
|
||
|
||
#if 0
|
||
|
||
WCHAR BootPath[TMP_BUFFER_SIZE];
|
||
WCHAR ComputerName[TMP_BUFFER_SIZE];
|
||
WCHAR DsPath[TMP_BUFFER_SIZE];
|
||
|
||
|
||
NTSTATUS
|
||
ModifyDSEntries(
|
||
IN PVOID pBuffer,
|
||
IN ULONG Length
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine does all the munging of DS entries to make this machine look
|
||
like a remote boot client.
|
||
|
||
Arguments:
|
||
|
||
pBuffer - Pointer to any arguments passed in the to do item.
|
||
|
||
Length - Length, in bytes of the arguments.
|
||
|
||
Return Value:
|
||
|
||
STATUS_SUCCESS if it completes the to do item properly.
|
||
|
||
--*/
|
||
|
||
{
|
||
NTSTATUS Status;
|
||
PLDAP LdapHandle;
|
||
ULONG TmpUlong;
|
||
ULONG LdapError;
|
||
|
||
LDAPMod FilePathMod;
|
||
|
||
WCHAR *AttrValues1[2];
|
||
|
||
PLDAPMod Modifiers[2];
|
||
|
||
PIMIRROR_MODIFY_DS_INFO pModifyInfo;
|
||
|
||
DWORD Error;
|
||
HKEY hkey;
|
||
PWCHAR pTmp;
|
||
|
||
HANDLE Handle;
|
||
IO_STATUS_BLOCK IoStatus;
|
||
UNICODE_STRING UnicodeString;
|
||
OBJECT_ATTRIBUTES ObjectAttributes;
|
||
|
||
PUCHAR pch;
|
||
|
||
DWORD NameLength;
|
||
DWORD SidLength;
|
||
DWORD DomainLength;
|
||
DWORD RequestSize;
|
||
SID_NAME_USE snu;
|
||
|
||
PDOMAIN_CONTROLLER_INFO DCInfo;
|
||
|
||
IMirrorNowDoing(PatchDSEntries, NULL);
|
||
|
||
if (Length != sizeof(IMIRROR_MODIFY_DS_INFO)) {
|
||
IMirrorHandleError(ERROR_DS_SERVER_DOWN, PatchDSEntries);
|
||
return ERROR_DS_SERVER_DOWN;
|
||
}
|
||
|
||
pModifyInfo = (PIMIRROR_MODIFY_DS_INFO)pBuffer;
|
||
|
||
//
|
||
// Verify that server exists.
|
||
//
|
||
Status = VerifyServerExists(pModifyInfo->ServerName,
|
||
(wcslen(pModifyInfo->ServerName) + 1) * sizeof(WCHAR)
|
||
);
|
||
|
||
if (!NT_SUCCESS(Status)) {
|
||
IMirrorHandleError(Status, PatchDSEntries);
|
||
return Status;
|
||
}
|
||
//
|
||
// Get the computer name
|
||
//
|
||
NameLength = TMP_BUFFER_SIZE;
|
||
if (!GetComputerName(ComputerName, &NameLength)) {
|
||
IMirrorHandleError(STATUS_NO_MEMORY, PatchDSEntries);
|
||
return STATUS_NO_MEMORY;
|
||
}
|
||
ComputerName[NameLength] = UNICODE_NULL;
|
||
NameLength++;
|
||
|
||
//
|
||
//
|
||
// Before doing anything else, setup the values we are going to use later.
|
||
//
|
||
//
|
||
|
||
//
|
||
// Setup BootPath
|
||
//
|
||
swprintf(BootPath, L"%ws\\Clients\\%ws\\startrom.com", pModifyInfo->ServerName, ComputerName);
|
||
|
||
//
|
||
// Get the path to this machine object
|
||
//
|
||
TmpUlong = sizeof(DsPath);
|
||
if (!GetComputerObjectName(NameFullyQualifiedDN, DsPath, &TmpUlong)) {
|
||
Error = GetLastError();
|
||
IMirrorHandleError(Error, PatchDSEntries);
|
||
return STATUS_UNSUCCESSFUL;
|
||
}
|
||
|
||
//
|
||
// Connect to the DS
|
||
//
|
||
LdapHandle = ldap_init(NULL, LDAP_PORT);
|
||
|
||
if (LdapHandle == NULL) {
|
||
Error = GetLastError();
|
||
IMirrorHandleError(Error, PatchDSEntries);
|
||
return STATUS_UNSUCCESSFUL;
|
||
}
|
||
|
||
TmpUlong = DS_DIRECTORY_SERVICE_REQUIRED | DS_IP_REQUIRED;
|
||
ldap_set_option(LdapHandle, LDAP_OPT_GETDSNAME_FLAGS, &TmpUlong);
|
||
|
||
TmpUlong = (ULONG) LDAP_OPT_ON;
|
||
ldap_set_option(LdapHandle, LDAP_OPT_REFERRALS, (void *)&TmpUlong);
|
||
|
||
TmpUlong = LDAP_VERSION3;
|
||
ldap_set_option(LdapHandle, LDAP_OPT_VERSION, &TmpUlong);
|
||
|
||
LdapError = ldap_connect(LdapHandle,0);
|
||
|
||
if (LdapError != LDAP_SUCCESS) {
|
||
ldap_unbind(LdapHandle);
|
||
IMirrorHandleError(LdapError, PatchDSEntries);
|
||
return STATUS_UNSUCCESSFUL;
|
||
}
|
||
|
||
//
|
||
// Make the binding
|
||
//
|
||
LdapError = ldap_bind_s(LdapHandle, NULL, NULL, LDAP_AUTH_NEGOTIATE);
|
||
if (LdapError != LDAP_SUCCESS) {
|
||
ldap_unbind(LdapHandle);
|
||
IMirrorHandleError(LdapError, PatchDSEntries);
|
||
return STATUS_UNSUCCESSFUL;
|
||
}
|
||
|
||
//
|
||
// Setup the attribute changes
|
||
//
|
||
|
||
FilePathMod.mod_op = LDAP_MOD_REPLACE;
|
||
FilePathMod.mod_type = L"netbootMachineFilePath";
|
||
FilePathMod.mod_values = AttrValues1;
|
||
AttrValues1[0] = BootPath;
|
||
AttrValues1[1] = NULL;
|
||
|
||
Modifiers[0] = &FilePathMod;
|
||
Modifiers[1] = NULL;
|
||
|
||
//
|
||
// Submit the changes to the DS
|
||
//
|
||
LdapError = ldap_modify_s(LdapHandle, DsPath, Modifiers);
|
||
|
||
ldap_unbind(LdapHandle);
|
||
|
||
if (LdapError != LDAP_SUCCESS) {
|
||
IMirrorHandleError(LdapError, PatchDSEntries);
|
||
return STATUS_UNSUCCESSFUL;
|
||
}
|
||
return STATUS_SUCCESS;
|
||
}
|
||
#endif
|
||
|