|
|
/*++
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
|