309 lines
7.3 KiB
C
309 lines
7.3 KiB
C
/*
|
|
This is cleanri
|
|
*/
|
|
#include <windows.h>
|
|
#include <winldap.h>
|
|
#include <dsgetdc.h>
|
|
#define SECURITY_WIN32
|
|
#include <security.h>
|
|
#include "resource.h"
|
|
|
|
HINSTANCE g_hInstance = NULL;
|
|
|
|
#ifdef DBG
|
|
#define DebugOut OutputDebugString
|
|
#else
|
|
#define DebugOut 1 ? (void)0 : (void)
|
|
#endif
|
|
|
|
#define ARRAYSIZE( array ) sizeof( array ) / sizeof(( array )[ 0 ] )
|
|
|
|
//
|
|
// Ldap_InitializeConnection( )
|
|
//
|
|
DWORD
|
|
Ldap_InitializeConnection(
|
|
PLDAP * LdapHandle )
|
|
{
|
|
PLDAPMessage OperationalAttributeLdapMessage;
|
|
PLDAPMessage CurrentEntry;
|
|
|
|
DWORD LdapError = LDAP_SUCCESS;
|
|
|
|
if ( !( *LdapHandle ) ) {
|
|
ULONG temp = DS_DIRECTORY_SERVICE_REQUIRED |
|
|
DS_IP_REQUIRED |
|
|
DS_GC_SERVER_REQUIRED;
|
|
|
|
DebugOut( L"Initializing LDAP connection.\n" );
|
|
|
|
*LdapHandle = ldap_init( NULL, LDAP_PORT);
|
|
|
|
if ( !*LdapHandle )
|
|
{
|
|
DebugOut( L"ldap_init() failed.\n" );
|
|
LdapError = LDAP_UNAVAILABLE;
|
|
goto e0;
|
|
}
|
|
|
|
ldap_set_option( *LdapHandle, LDAP_OPT_GETDSNAME_FLAGS, &temp );
|
|
|
|
temp = LDAP_VERSION3;
|
|
ldap_set_option( *LdapHandle, LDAP_OPT_VERSION, &temp );
|
|
|
|
LdapError = ldap_connect( *LdapHandle, 0 );
|
|
if ( LdapError != LDAP_SUCCESS )
|
|
{
|
|
DebugOut( L"ldap_connect() failed.\n" );
|
|
goto e1;
|
|
}
|
|
|
|
LdapError = ldap_bind_s( *LdapHandle, NULL, NULL, LDAP_AUTH_SSPI );
|
|
if ( LdapError != LDAP_SUCCESS )
|
|
{
|
|
DebugOut( L"ldap_bind_s() failed.\n" );
|
|
goto e1;
|
|
}
|
|
}
|
|
|
|
DebugOut( L"LDAP initialization succeeded.\n" );
|
|
|
|
e0:
|
|
return LdapError;
|
|
|
|
e1:
|
|
ldap_unbind( *LdapHandle );
|
|
*LdapHandle = NULL;
|
|
goto e0;
|
|
}
|
|
|
|
void
|
|
ErrorMessage(
|
|
ULONG LdapError )
|
|
{
|
|
WCHAR szTmp[ 512 ];
|
|
WCHAR szText[ 512 ];
|
|
WCHAR szTitle[ 64 ];
|
|
|
|
LoadString( g_hInstance, IDS_UNABLE_TITLE, szTitle, ARRAYSIZE(szTitle) );
|
|
LoadString( g_hInstance, IDS_UNABLE_TEXT, szTmp, ARRAYSIZE(szTmp) );
|
|
|
|
wsprintf( szText, szTmp, LdapError );
|
|
|
|
MessageBox( NULL, szText, szTitle, MB_OK );
|
|
}
|
|
|
|
//
|
|
// WinMain()
|
|
//
|
|
int APIENTRY
|
|
WinMain(
|
|
HINSTANCE hInstance,
|
|
HINSTANCE hPrevInstance,
|
|
LPSTR lpCmdLine,
|
|
int nCmdShow)
|
|
{
|
|
LPWSTR pszDN = NULL;
|
|
LPWSTR *ppszDN = NULL;
|
|
PLDAP LdapHandle = NULL;
|
|
PLDAPMessage LdapMessage = NULL;
|
|
int iErr = -1;
|
|
|
|
ULONG nSize;
|
|
ULONG LdapError;
|
|
LPWSTR pszAttributes[ 2 ];
|
|
DWORD dwCount;
|
|
PLDAPMessage LdapCurrent;
|
|
|
|
g_hInstance = hInstance;
|
|
|
|
if ( !GetComputerObjectName( NameFullyQualifiedDN, NULL, &nSize ) )
|
|
{
|
|
DebugOut( L"GetComputerObjectName() failed.\n" );
|
|
iErr = -2;
|
|
goto Cleanup;
|
|
}
|
|
DebugOut( L"Got GetComputerObjectName() nSize.\n" );
|
|
|
|
pszDN = (LPWSTR) LocalAlloc( LMEM_FIXED, nSize * sizeof(WCHAR) );
|
|
if ( !pszDN )
|
|
{
|
|
DebugOut( L"Out of memory.\n" );
|
|
iErr = -3;
|
|
goto Cleanup;
|
|
}
|
|
DebugOut( L"Allocated memory.\n" );
|
|
|
|
if ( !GetComputerObjectName( NameFullyQualifiedDN, pszDN, &nSize ) )
|
|
{
|
|
DebugOut( L"GetComputerObjectName() failed.\n" );
|
|
iErr = -4;
|
|
goto Cleanup;
|
|
}
|
|
DebugOut( L"Got GetComputerObjectName().\n" );
|
|
DebugOut( L"Computer DN: " );
|
|
DebugOut( pszDN );
|
|
DebugOut( L"\n" );
|
|
|
|
if ( Ldap_InitializeConnection( &LdapHandle ) )
|
|
{
|
|
DebugOut( L"Ldap failed to initialize.\n" );
|
|
iErr = -5;
|
|
goto Cleanup;
|
|
}
|
|
DebugOut( L"Ldap initialized.\n" );
|
|
|
|
pszAttributes[0] = L"netbootSCPBL";
|
|
pszAttributes[1] = NULL;
|
|
|
|
TrySearchAgain:
|
|
LdapError = ldap_search_ext_s( LdapHandle,
|
|
pszDN,
|
|
LDAP_SCOPE_BASE,
|
|
L"objectClass=Computer",
|
|
pszAttributes,
|
|
FALSE,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
0,
|
|
&LdapMessage );
|
|
switch( LdapError )
|
|
{
|
|
case LDAP_SUCCESS:
|
|
break;
|
|
|
|
case LDAP_BUSY:
|
|
case LDAP_TIMEOUT:
|
|
DebugOut( L"ldap_search_ext_s() failed. Trying again.\n" );
|
|
goto TrySearchAgain;
|
|
|
|
default:
|
|
DebugOut( L"ldap_search_ext_s() failed. Displaying pop-up.\n" );
|
|
ErrorMessage( LdapError );
|
|
iErr = -6;
|
|
goto Cleanup;
|
|
}
|
|
DebugOut( L"ldap_search_ext_s() succeeded.\n" );
|
|
|
|
dwCount = ldap_count_entries( LdapHandle, LdapMessage );
|
|
if ( dwCount == 0 )
|
|
{
|
|
DebugOut( L"ldap_search_ext_s() returned a count of zero. Nothing to do.\n" );
|
|
iErr = -7;
|
|
goto Cleanup; // NOP
|
|
}
|
|
DebugOut( L"ldap_search_ext_s() found an SCP.\n" );
|
|
|
|
LdapCurrent = ldap_first_entry( LdapHandle, LdapMessage );
|
|
if ( !LdapCurrent )
|
|
{
|
|
DebugOut( L"Couldn't retrieve the first entry. Aborting...\n" );
|
|
iErr = -8;
|
|
goto Cleanup;
|
|
}
|
|
|
|
ppszDN = ldap_get_values( LdapHandle, LdapCurrent, L"netbootSCPBL");
|
|
if ( !ppszDN )
|
|
{
|
|
DebugOut( L"No DN to SCP. How did we did we get here then?\n" );
|
|
iErr = -9;
|
|
goto Cleanup;
|
|
}
|
|
DebugOut( L"SCP DN: " );
|
|
DebugOut( *ppszDN );
|
|
DebugOut( L"\n" );
|
|
|
|
TryDeleteAgain:
|
|
LdapError = ldap_delete_s( LdapHandle, *ppszDN );
|
|
switch ( LdapError )
|
|
{
|
|
case LDAP_SUCCESS:
|
|
break;
|
|
|
|
case LDAP_BUSY:
|
|
case LDAP_TIMEOUT:
|
|
DebugOut( L"ldap_delete_s() failed. Trying again.\n" );
|
|
goto TryDeleteAgain;
|
|
|
|
default:
|
|
{
|
|
LPWSTR pszExtendedError;
|
|
DebugOut( L"ldap_delete_s() failed. Displaying pop-up.\n" );
|
|
|
|
ldap_get_option(LdapHandle, LDAP_OPT_SERVER_ERROR, (void *) &pszExtendedError);
|
|
DebugOut( L"Extended Error: " );
|
|
DebugOut( pszExtendedError );
|
|
DebugOut( L"\n" );
|
|
|
|
ErrorMessage( LdapError );
|
|
iErr = -9;
|
|
goto Cleanup;
|
|
}
|
|
}
|
|
|
|
DebugOut( L"SCP deletion succeeded.\n" );
|
|
iErr = ERROR_SUCCESS;
|
|
|
|
Cleanup:
|
|
DebugOut( L"Cleaning up...\n" );
|
|
if ( ppszDN )
|
|
ldap_value_free( ppszDN );
|
|
|
|
if ( LdapMessage )
|
|
ldap_msgfree( LdapMessage );
|
|
|
|
if ( LdapHandle )
|
|
ldap_unbind( LdapHandle );
|
|
|
|
if ( pszDN )
|
|
LocalFree( pszDN );
|
|
|
|
return iErr;
|
|
}
|
|
|
|
// stolen from the CRT, used to shrink our working set
|
|
int _stdcall ModuleEntry(void)
|
|
{
|
|
int i;
|
|
STARTUPINFOA si;
|
|
LPSTR pszCmdLine = GetCommandLineA();
|
|
|
|
|
|
if ( *pszCmdLine == '\"' )
|
|
{
|
|
/*
|
|
* Scan, and skip over, subsequent characters until
|
|
* another double-quote or a null is encountered.
|
|
*/
|
|
while ( *++pszCmdLine && (*pszCmdLine != '\"') );
|
|
/*
|
|
* If we stopped on a double-quote (usual case), skip
|
|
* over it.
|
|
*/
|
|
if ( *pszCmdLine == '\"' )
|
|
pszCmdLine++;
|
|
}
|
|
else
|
|
{
|
|
while (*pszCmdLine > ' ')
|
|
pszCmdLine++;
|
|
}
|
|
|
|
/*
|
|
* Skip past any white space preceeding the second token.
|
|
*/
|
|
while (*pszCmdLine && (*pszCmdLine <= ' '))
|
|
{
|
|
pszCmdLine++;
|
|
}
|
|
|
|
si.dwFlags = 0;
|
|
GetStartupInfoA(&si);
|
|
|
|
i = WinMain(GetModuleHandle(NULL), NULL, pszCmdLine,
|
|
si.dwFlags & STARTF_USESHOWWINDOW ? si.wShowWindow : SW_SHOWDEFAULT);
|
|
ExitProcess(i);
|
|
return i; // We never come here.
|
|
}
|