323 lines
8.6 KiB
C
323 lines
8.6 KiB
C
|
//================================================================================
|
||
|
// Copyright (C) 1997 Microsoft Corporation
|
||
|
// Author: RameshV
|
||
|
// Description: Dump the dhcp objects in DS (recursively).
|
||
|
//================================================================================
|
||
|
|
||
|
//BeginExport(overview)
|
||
|
//DOC DDSDMP is a command line for dumping the dhcp objects in DS.
|
||
|
//DOC It takes as parameter the DS DC to contact (optional).
|
||
|
//DOC The output is too fluid to spec out at this moment. Hopefully, it would be
|
||
|
//DOC something that would be understood by DDSINI (whenever that gets written).
|
||
|
//EndExport(overview)
|
||
|
|
||
|
//BeginImports(headers)
|
||
|
#include <hdrmacro.h>
|
||
|
#include <store.h>
|
||
|
#include <stdio.h>
|
||
|
#include <dhcpbas.h>
|
||
|
//EndImports(headers)
|
||
|
|
||
|
//BeginInternal(globals)
|
||
|
static DWORD nTabs = 0;
|
||
|
static LPWSTR RecurseFilter = L"(|(objectClass=dHCPClass)(objectClass=container))" ;
|
||
|
static WCHAR Buffer[1000];
|
||
|
static WCHAR Strings[30][100];
|
||
|
//EndExport(globals)
|
||
|
|
||
|
VOID
|
||
|
ErrorPrint(
|
||
|
IN LPSTORE_HANDLE hStore,
|
||
|
IN DWORD Result,
|
||
|
IN LPWSTR Comment
|
||
|
)
|
||
|
{
|
||
|
if( NULL != hStore ) {
|
||
|
printf("\n#%ws\n#%ws (errror %ld, 0x%lx)\n", hStore->Location, Comment, Result, Result );
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
printf("\n#%ws (errror %ld, 0x%lx)\n", Comment, Result, Result);
|
||
|
}
|
||
|
|
||
|
LPWSTR
|
||
|
ConvertDWORD(
|
||
|
IN DWORD d
|
||
|
)
|
||
|
{
|
||
|
swprintf(Buffer, L"0x%08lx", d);
|
||
|
return Buffer;
|
||
|
}
|
||
|
|
||
|
#define HEX(ch) ( ((ch) < 10)? ((ch) + L'0') : ((ch) + L'A' - 10))
|
||
|
|
||
|
LPWSTR
|
||
|
ConvertBINARY(
|
||
|
IN DWORD l,
|
||
|
IN LPBYTE s
|
||
|
)
|
||
|
{
|
||
|
DWORD i;
|
||
|
|
||
|
i = 0;
|
||
|
while( l ) {
|
||
|
Buffer[i++] = HEX(((*s)>>4));
|
||
|
Buffer[i++] = HEX(((*s) & 0x0F));
|
||
|
l --; s ++;
|
||
|
}
|
||
|
|
||
|
Buffer[i] = L'\0';
|
||
|
return Buffer;
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
Print(
|
||
|
IN LPWSTR Operation,
|
||
|
IN DWORD Type,
|
||
|
IN LPWSTR AttributeName
|
||
|
)
|
||
|
{
|
||
|
DWORD i;
|
||
|
|
||
|
putchar('\n');
|
||
|
for(i = 1; i < nTabs; i ++ ) printf(" ");
|
||
|
printf("%ws %ld :%ws", Operation, Type, AttributeName);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
PrintMore(
|
||
|
IN LPWSTR String
|
||
|
)
|
||
|
{
|
||
|
printf("=%ws", String);
|
||
|
}
|
||
|
|
||
|
|
||
|
VOID
|
||
|
PrintName(
|
||
|
IN LPSTORE_HANDLE hStore
|
||
|
)
|
||
|
{
|
||
|
DWORD i;
|
||
|
|
||
|
if( 1 == nTabs ) return;
|
||
|
|
||
|
putchar('\n');
|
||
|
for(i = 1; i < nTabs; i ++ ) printf(" ");
|
||
|
printf("object");
|
||
|
}
|
||
|
|
||
|
|
||
|
DWORD
|
||
|
AttributesDmp(
|
||
|
IN LPSTORE_HANDLE hStore
|
||
|
)
|
||
|
{
|
||
|
DWORD Result;
|
||
|
DWORD FoundParams, Type, MScopeId;
|
||
|
LARGE_INTEGER UniqueKey, Flags;
|
||
|
LPWSTR Name, Description, Location;
|
||
|
|
||
|
Result = DhcpDsGetAttribs(
|
||
|
/* Reserved */ DDS_RESERVED_DWORD,
|
||
|
/* hStore */ hStore,
|
||
|
/* FoundParams */ &FoundParams,
|
||
|
/* UniqueKey */ &UniqueKey,
|
||
|
/* Type */ &Type,
|
||
|
/* Flags */ &Flags,
|
||
|
/* Name */ &Name,
|
||
|
/* Description */ &Description,
|
||
|
/* Location */ &Location,
|
||
|
/* MScopeId */ &MScopeId
|
||
|
);
|
||
|
|
||
|
if( ERROR_SUCCESS != Result ) return Result;
|
||
|
|
||
|
if( !DhcpCheckParams(FoundParams, 0) ) {
|
||
|
Print(L"clear", 0, DHCP_ATTRIB_UNIQUE_KEY);
|
||
|
} else {
|
||
|
Print(L"update", 0, DHCP_ATTRIB_UNIQUE_KEY);
|
||
|
PrintMore(ConvertDWORD(UniqueKey.LowPart));
|
||
|
PrintMore(L" ");
|
||
|
PrintMore(ConvertDWORD(UniqueKey.HighPart));
|
||
|
}
|
||
|
|
||
|
if( !DhcpCheckParams(FoundParams, 1) ) {
|
||
|
Print(L"clear", 0, DHCP_ATTRIB_TYPE);
|
||
|
} else {
|
||
|
Print(L"update", 0, DHCP_ATTRIB_TYPE);
|
||
|
PrintMore(ConvertDWORD(Type));
|
||
|
}
|
||
|
if( !DhcpCheckParams(FoundParams, 2) ) {
|
||
|
Print(L"clear", 0, DHCP_ATTRIB_FLAGS);
|
||
|
} else {
|
||
|
Print(L"update", 0, DHCP_ATTRIB_FLAGS);
|
||
|
PrintMore(ConvertDWORD(Flags.LowPart));
|
||
|
PrintMore(L" ");
|
||
|
PrintMore(ConvertDWORD(Flags.HighPart));
|
||
|
}
|
||
|
if( !DhcpCheckParams(FoundParams, 3) ) {
|
||
|
Print(L"clear", 0, DHCP_ATTRIB_OBJ_NAME);
|
||
|
} else {
|
||
|
Print(L"update", 0, DHCP_ATTRIB_OBJ_NAME);
|
||
|
PrintMore(Name?Name:L"");
|
||
|
if( Name ) MemFree(Name);
|
||
|
}
|
||
|
if( !DhcpCheckParams(FoundParams, 4) ) {
|
||
|
Print(L"clear", 0, DHCP_ATTRIB_OBJ_DESCRIPTION);
|
||
|
} else {
|
||
|
Print(L"update", 0, DHCP_ATTRIB_OBJ_DESCRIPTION);
|
||
|
PrintMore(Description?Description:L"");
|
||
|
if( Description ) MemFree(Description);
|
||
|
}
|
||
|
if( !DhcpCheckParams(FoundParams, 5) ) {
|
||
|
Print(L"clear", 0, DHCP_ATTRIB_LOCATION_DN);
|
||
|
} else {
|
||
|
Print(L"update", 0, DHCP_ATTRIB_LOCATION_DN);
|
||
|
PrintMore(Location?Location:L"");
|
||
|
if( Location ) MemFree(Location);
|
||
|
}
|
||
|
if( !DhcpCheckParams(FoundParams, 6) ) {
|
||
|
Print(L"clear", 0, DHCP_ATTRIB_MSCOPEID);
|
||
|
} else {
|
||
|
Print(L"update", 0, DHCP_ATTRIB_MSCOPEID);
|
||
|
PrintMore(ConvertDWORD(MScopeId));
|
||
|
}
|
||
|
return ERROR_SUCCESS;
|
||
|
}
|
||
|
|
||
|
DWORD
|
||
|
RecurseDmp(
|
||
|
IN OUT LPSTORE_HANDLE hStore
|
||
|
)
|
||
|
{
|
||
|
DWORD Result;
|
||
|
STORE_HANDLE hStore2;
|
||
|
|
||
|
nTabs ++;
|
||
|
PrintName(hStore);
|
||
|
|
||
|
Result = AttributesDmp(hStore);
|
||
|
if( ERROR_SUCCESS != Result ) {
|
||
|
ErrorPrint(hStore, Result, L"AttributesDmp failed");
|
||
|
}
|
||
|
|
||
|
Result = StoreSetSearchOneLevel(hStore, 0);
|
||
|
if( ERROR_SUCCESS != Result ) {
|
||
|
ErrorPrint(hStore, Result, L"StoreSetSearchOneLevel failed");
|
||
|
nTabs --;
|
||
|
return Result;
|
||
|
}
|
||
|
|
||
|
Result = StoreBeginSearch(hStore, 0, RecurseFilter);
|
||
|
if( ERROR_SUCCESS != Result ) {
|
||
|
ErrorPrint(hStore, Result, L"StoreBeginSearch failed");
|
||
|
} else {
|
||
|
while ( ERROR_SUCCESS == Result ) {
|
||
|
Result = StoreSearchGetNext(hStore, 0, &hStore2);
|
||
|
if( ERROR_SUCCESS != Result ) {
|
||
|
if( ERROR_FILE_NOT_FOUND == Result ) break;
|
||
|
if( ERROR_NO_MORE_ITEMS == Result ) break;
|
||
|
ErrorPrint(hStore, Result, L"StoreSearchGetNext failed");
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
Result = RecurseDmp(&hStore2);
|
||
|
if( ERROR_SUCCESS != Result ) {
|
||
|
ErrorPrint(&hStore2, Result, L"RecurseDmp failed");
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
StoreCleanupHandle(&hStore2, 0);
|
||
|
}
|
||
|
|
||
|
StoreEndSearch(hStore, 0);
|
||
|
}
|
||
|
|
||
|
nTabs --;
|
||
|
return ERROR_SUCCESS;
|
||
|
}
|
||
|
|
||
|
LPWSTR
|
||
|
ConvertToLPWSTR(
|
||
|
IN LPSTR s
|
||
|
)
|
||
|
{
|
||
|
LPWSTR u, v;
|
||
|
|
||
|
if( NULL == s ) return L"";
|
||
|
|
||
|
u = LocalAlloc(LMEM_FIXED, (strlen(s)+1)*sizeof(WCHAR));
|
||
|
if( NULL == u ) return L"";
|
||
|
|
||
|
v = u;
|
||
|
while( *v++ = *s++)
|
||
|
;
|
||
|
|
||
|
return u;
|
||
|
}
|
||
|
|
||
|
|
||
|
void _cdecl main(
|
||
|
int argc,
|
||
|
char *argv[]
|
||
|
)
|
||
|
{
|
||
|
LPWSTR RootName;
|
||
|
STORE_HANDLE Store, Store2;
|
||
|
DWORD Result;
|
||
|
|
||
|
RootName = NULL;
|
||
|
if( argc > 2 ) {
|
||
|
printf("Usage: %s ServerToContact\n", argv[0]);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if( 2 == argc ) {
|
||
|
RootName = ConvertToLPWSTR(argv[1]);
|
||
|
if( NULL == RootName ) {
|
||
|
printf("RootDN confusing\n");
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Result = StoreInitHandle(
|
||
|
&Store, 0, RootName, NULL, NULL, NULL,
|
||
|
ADS_SECURE_AUTHENTICATION
|
||
|
);
|
||
|
if( ERROR_SUCCESS != Result ) {
|
||
|
printf("StoreInitHandle: %ld\n", Result);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
Result = StoreGetHandle(
|
||
|
/* hStore */ &Store,
|
||
|
/* Reserved */ DDS_RESERVED_DWORD,
|
||
|
/* StoreGetType */ StoreGetChildType,
|
||
|
/* Path */ L"CN=NetServices,CN=Services",
|
||
|
/* hStoreOut */ &Store2
|
||
|
);
|
||
|
if( ERROR_SUCCESS != Result ) {
|
||
|
printf("Could not get the netservices container\n");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
StoreCleanupHandle(&Store,0);
|
||
|
|
||
|
printf("################################################################################\n");
|
||
|
printf("## G E N E R E R A T E D D D S D U M P ##\n");
|
||
|
printf("## command line : (will be filled in future versions) ##\n");
|
||
|
printf("## DDSMP.EXE 1.0 ##\n");
|
||
|
printf("################################################################################\n");
|
||
|
printf("object %ws", RootName);
|
||
|
|
||
|
RecurseDmp(&Store2);
|
||
|
putchar('\n');
|
||
|
|
||
|
exit(0);
|
||
|
}
|
||
|
|
||
|
//================================================================================
|
||
|
// end of file
|
||
|
//================================================================================
|