Maile gesperrte Domänenkonten

Zweck ist es dem Domänenadministrator alle gesperrten(nicht die deaktivierten) Domänenkonten anzuzeigen, damit er darauf entsprechend reagieren kann.
Dazu muss auf dem Rechner ein C-Compiler (LCC) installiert sein und die beiden aufgeführten Dateien in ein Verzeichnis kopiert werden.
Hier ist der Compiler (http://www.cs.virginia.edu/~lcc-win32) nach c:\programme\LCC installiert.

compile.bat
c:\programme\lcc\bin\lcc -O2 -A -unused -overflowcheck maillockedUser.c
c:\programme\lcc\bin\lcclnk -s maillockeduser.obj uuid.lib ole32.lib oleaut32.lib activeds.lib msvcrt.lib wsock32.lib
del *.obj
MaillockedUser.c
// gesperrte Benutzer anzeigen / borwinius 2005
#include <stdio.h>
#include <windows.h>
#include <winsock2.h>
#include <windowsx.h>
#include <tchar.h>
#include <string.h>
#include <shellapi.h>
#include <shlobj.h>
#include <activeds.h>
 
void MySnd(char *, char *, char *, char *); //Mail per SMTP senden
 
#define laenge 256
 
TCHAR szStr[1024], szStrRcv[1024 * 1024], szResult[1024 * 50];
char buf[255],buf2[255];//
LPSTR lpstrBuf;
double tage;
 
// hier eigene Werte eintragen!
TCHAR szSender[laenge] = "hausnetz@dom.ain";
TCHAR szXmailer[laenge] = "automatischer Mailer copyright ";
TCHAR lpszTo[laenge] = "hausnetz@dom.ain";
TCHAR lpszServer[laenge] = "smtpServerNameoderIP";
TCHAR szUeberschrift[laenge]= "gesperrte Benutzer";
 
//------------------------------------------------------------------
int main(void)
{
 
    IADs *pADs;
    IADsContainer * pCont;
    IADsUser *pADsUser;
    BSTR bstr;
    HRESULT hr;
    VARIANT vChild;//, var;
    short bo;
    BOOL bgesperrt = 0;
 
    // Initialize COM before calling any ADSI functions or interfaces.
    hr = CoInitialize(NULL);
    if (hr != S_OK) { return 0; }
    // hier eigene Werte eintragen !
    hr = ADsGetObject( L"WinNT://myNTDomain", &IID_IADsContainer, (void**) &pCont);
    if( hr==S_OK)
    {
     IEnumVARIANT * pEnum;
     ADsBuildEnumerator (pCont,&pEnum);
     while((hr = ADsEnumerateNext (pEnum, 1, &vChild, NULL)) == S_OK)
     {
       if(hr!=S_OK) break;
          hr = vChild.pdispVal->QueryInterface (&IID_IADsUser,(void**)&pADsUser);
	  if(hr!=S_OK) break;
          VariantClear(&vChild);
          if(hr!=S_OK) break;
          hr = pADsUser->QueryInterface(&IID_IADs, (void**) &pADs);
          if(hr!=S_OK) break;
          if( S_OK == pADs->get_Name(&bstr) )
           {
            //--------------------------------------------------
	    //hr = pADsUser->get_PasswordExpirationDate(&date);
	    //hr = pADsUser->get_AccountDisabled(
	    hr = pADsUser->get_IsAccountLocked(&bo);
 
	    if (SUCCEEDED(hr))
		{
		 if (bo)
 		 {
                  bgesperrt = 1;
		  WideCharToMultiByte(CP_ACP, 0, bstr, -1, buf, sizeof( buf),NULL,NULL);
                  strcat(buf," gesperrt\n\n");
		  strcat(buf2,buf);
		  //		printf("buf2 %s\n",buf2);
                  SysFreeString(bstr);
		}
	       }
	    }
//--------------------------------------------------
     pADsUser->Release();
     pADs->Release();
    }
   // SysFreeString(bstr);
    ADsFreeEnumerator(pEnum);
    pCont->Release();
 }
 if (bgesperrt == 1)
  {
	MySnd(lpszServer,lpszTo, szUeberschrift, buf2); // Email an hausnetzadmin senden
      //MySnd(lpszServer,"zweiterEmpfänger@dom.ain", szUeberschrift, buf2); // Email an zweiten Empfänger senden
  }
 CoUninitialize();
 return 1;
}
//-------------------------------------------------------------
//SMTP-Mailfunktion
void MySnd(char *lpszServer , char *lpszTo, char *lpszSubject, char *lpszMail)
{
    WSADATA wsaData;
    LPHOSTENT lpHost;
    LPSERVENT lpServ;
    SOCKET s;
    int iProtocolPort;
    SOCKADDR_IN sockadd;
    char *seps = "\r", *token;
 
    if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) {
        printf("WSAStartup \tError\n");
        return;
    }
    if (strcmp(lpszServer, "") == 0) {
        printf("kein szServerName ? \tFehler\n");
        return ;
    }
    lpHost = gethostbyname(lpszServer);
    if (lpHost == NULL) {
        printf("%s existiert nicht oder kann nicht aufgelöst werden", lpszServer);
        return;
    }
    s = socket(PF_INET, SOCK_STREAM, 0);
    if (s == INVALID_SOCKET)
     {
        printf("INVALID_SOCKET \tError\n");
        return;
     }
    lpServ = getservbyname("mail", NULL); // SMTPPort  ermitteln
    if (lpServ == NULL) 
     {
       printf("getservbyname\n");
       iProtocolPort = htons(IPPORT_SMTP);
     } 
     else 
     {
        iProtocolPort = lpServ->s_port;
     }
    sockadd.sin_family = AF_INET;
    sockadd.sin_port = iProtocolPort;
    sockadd.sin_addr = *((LPIN_ADDR)*lpHost->h_addr_list);
    if (connect(s, (PSOCKADDR)&sockadd, sizeof(sockadd))) 
     {
        printf("Socket connect \tError\n");
        return;
     }
    memset(szStrRcv, '\0', sizeof(szStrRcv));
    recv(s, szStrRcv, sizeof(szStrRcv), 0);
    //printf("%s\n",szStrRcv);
 
    strcpy(szStr,  "HELO ");			// Verbindung mit Server herstellen
    strcat(szStr, lpszServer);
    strcat(szStr, "\r\n");
    send(s, szStr, strlen(szStr), 0);
    memset(szStrRcv, '\0', sizeof(szStrRcv));
    recv(s, szStrRcv, sizeof(szStrRcv), 0);
    // printf("%s\n",szStrRcv);
 
    if (strcmp(szSender, "") == 0) 
    {
      printf("kein Absender ? \t Fehler \n");
      return ;
    }
    wsprintf(szStr, "MAIL FROM: <%s>\r\n", szSender); // Absender angeben
    send(s, szStr, strlen(szStr), 0);
    memset(szStrRcv, '\0', sizeof(szStrRcv));
    recv(s, szStrRcv, sizeof(szStrRcv), 0);
    // printf("%s\n",szStrRcv);
 
    wsprintf(szStr, "RCPT TO:<%s>\r\n", lpszTo); // Empfänger angeben
    send(s, szStr, strlen(szStr), 0);
    memset(szStrRcv, '\0', sizeof(szStrRcv));
    recv(s, szStrRcv, sizeof(szStrRcv), 0);
    // printf("%s\n",lpszTo);//szStrRcv);
 
    /*    wsprintf(szStr, "RCPT TO:<zweiter.empfaenger@mydom.ain>\r\n"); // Empfänger 2 (bcc)angeben
          send(s, szStr, strlen(szStr), 0);
          memset(szStrRcv, '\0', sizeof(szStrRcv));
          recv(s, szStrRcv, sizeof(szStrRcv), 0);
          printf("%s\n",szStrRcv);
    */
    strcpy(szStr, "DATA\r\n");					//Daten übergeben
    send(s, szStr, strlen(szStr), 0);
    memset(szStrRcv, '\0', sizeof(szStrRcv));
    recv(s, szStrRcv, sizeof(szStrRcv), 0);
    // printf("%s\n",szStrRcv);
 
    strcpy(szStr, "X-Mailer: ");
    lstrcat(szStr,szXmailer);lstrcat(szStr,"\r\n");
    send(s, szStr, strlen(szStr), 0);
 
    strcpy(szStr, "From: ");
    lstrcat(szStr,szSender);lstrcat(szStr,"\r\n");
    send(s, szStr, strlen(szStr), 0);
 
    strcpy(szStr, "To: ");
    lstrcat(szStr,lpszTo);lstrcat(szStr,"\r\n");
    send(s, szStr, strlen(szStr), 0);
 
    wsprintf(szStr, "Subject: %s \r\n", lpszSubject); // Betreff
    send(s, szStr, strlen(szStr), 0);
    strcpy(szStr, "\r\n");
    send(s, szStr, strlen(szStr), 0);
 
    token = strtok(lpszMail, seps);
 
    while (token != NULL) {
        if (token[0] == '\n') 
        {
            strcpy(szStr, token + 1);
        }
        else
        {
            strcpy(szStr, token);
        }
        strcat(szStr, "\r\n");
        send(s, szStr, strlen(szStr), 0);
        token = strtok(NULL, seps);
   }
    strcpy(szStr, ".\r\n");							// Ende der Daten
    send(s, szStr, strlen(szStr), 0);
    memset(szStrRcv, '\0', sizeof(szStrRcv));
    recv(s, szStrRcv, sizeof(szStrRcv), 0);
    // printf("%s\n",szStrRcv);
 
    strcpy(szStr,  "QUIT\r\n");						// Ende der Verbindung
    send(s, szStr, strlen(szStr), 0);
    memset(szStrRcv, '\0', sizeof(szStrRcv));
    recv(s, szStrRcv, sizeof(szStrRcv), 0);
    // printf("%s\n",szStrRcv);
    closesocket(s);
    WSACleanup();
    // printf("keine Verbindung mehr \n");
    return;
}
//-----------------------------------------------------------------

Die Variablen im C-Code einschließlich „myNTDomain“ müssen angepasst werden.
Anschließend wird die compile.bat doppelt angeklickt oder in der Kommandozeile aufgerufen.
Sie erstellt eine Datei MaillockedUser.exe
Diese EXE wird auf einen Domänencontroller kopiert und per geplantem Task jeden Morgen um 7 Uhr gestartet.
Jetzt erhält der Hausnetzadmin jeden Morgen Um 7 Uhr eine Mail mit Benutzern die sich wegen falscher Passwörter ausgelockt haben.
Mann kann dass aber auch um 12 Uhr nochmal wiederholen. Die Systemlast durch das Programm ist nicht sehr hoch.