Telefonbuch

    Telefonbuch für Active Directory




    Für diejenigen, die den Artikel nicht lesen möchten, sofort das Repository auf Github .

    Und der Rest unter der Katze wartet auf eine inkohärente und bedeutungslose Geschichte darüber, wie ich zu einem solchen Leben gekommen bin. Mit Hilfe des Node-Webkits habe ich eine Anwendung geschrieben, auf die ich seit einem Jahr gewartet habe .
    Mein ganzes Leben als Systemadministrator habe ich MS Active Directory bewundert. Und sobald sich eine solche Gelegenheit bot - stellte sie das Unternehmen vor, in dem ich arbeite.

    Und los geht's ... Ich begann alles zu integrieren, was ich mit AD erreichen konnte. Authentifizierungsproxies, Mitarbeiterdatenbank für ACS, Anti-Virus usw. Und ich hatte nicht genug für das Glück eines Telefonbuchs, die alle Daten aus der AD-Datenbank übernehmen würde. Seit sechs Monaten quäle ich Google zu diesem Thema, aber die Ergebnisse sind nicht tröstlich.

    Die Grundvoraussetzungen für ein solches Verzeichnis:
    1. separate tragbare Anwendung. Jedes Mal, wenn ich auf ein webbasiertes Verzeichnis stieß, dachte ich: "Wenn Sie einen Server dafür einrichten, erstelle ich bereits ein vollwertiges Unternehmensportal, und jetzt brauche ich nur noch ein kleines Verzeichnis."
    2. frei
    3. Am einfachsten und bequemsten zu bedienen. Es schien mir immer nur ein Tisch mit Sortieren und Suchen


    Aus dem gesamten Zoo solcher Software, die ich gefunden habe, gibt es verschiedene Arten:
    Ich habe einmal eine Serverversion in PHP gesehen, sie aber beim Schreiben eines Artikels nicht gefunden. Es kann der 3. Gruppe zugeordnet werden, da die Serveranforderung für mich ein Nachteil ist.
    Bezüglich der Referenz von dmsoft
    Es sieht so aus

    Und es gibt keine Möglichkeit, zumindest die Spaltenbreite des Telefons standardmäßig zu vergrößern. Und das Einrichten der Benutzeroberfläche bei jedem Start ist furchtbar ärgerlich.

    Nichts deutete auf die Probleme bei der Lösung dieses Problems hin, aber vorgestern habe ich etwas über das Node-Webkit erfahren !

    Fähigkeit, eine Desktop-Anwendung in einer vertrauten Sprache zu schreiben - was könnte besser sein? Meine Freude kannte keine Grenzen.
    Aber Pech ... Zu Hause arbeitet plötzlich ein kleines Kind, das ständig Aufmerksamkeit benötigt und bei der Arbeit ist . Es gibt keine Zeit und keinen Ort, um kategorisch zu codieren.
    Aber das Schicksal war günstig für mich - am Sonntagnachmittag beschloss das Kind zu schlafen . Die Frau, die sich anscheinend an meine begeisterten Schreie erinnert, wie cool das Node-Webkit ist, und meine geheimen Wünsche enträtselt, als sie auf die Frage

    antwortet: " Was machen wir, während das Baby schläft? "

    Folge 1: Pre-Prototyp März


    Und so. Ich habe 1,5 - 2 Stunden Zeit, um die neue Technologie zu erlernen (sogar zwei, da ich dies nicht getan habe) und Software damit zu schreiben, die aus irgendeinem Grund noch keiner der Open-Source-Programmierer geschrieben hat .

    Zunächst fragte Google nach der Verbindung von nodejs mit ActiveDirectory. Er schlug zwei Module vor: node-activedirectory und ldapjs . Verstehen Sie, dass bis wann nicht, so fiel die Wahl auf die erste.
    CODE
    var ActiveDirectory = require('activedirectory');
    var ad = new ActiveDirectory('ldap://example.com', 'dc=example,dc=com', 'superadmin', 'pass');
    var groupName = 'Employees';
    ad.getUsersForGroup(groupName, function(err, users) {
      if (err) {
        console.log('ERROR: ' +JSON.stringify(err));
        return;
      }
      if (! users) console.log('Group: ' + groupName + ' not found.');
      else {
        console.log(users);
      }
    });
    

    Übrigens ungefähr
    var groupName = 'Employees';
    MITARBEITER - eine Gruppe, die alle aktuellen Mitarbeiter umfasst
    ERGEBNIS
    ERROR: {"dn":"","code":49,"name":"InvalidCredentialsError","message":"80090308: LdapErr: DSID-0C0903A9, comment: AcceptSecurityContext error, data 52e, v1db0\u0000"}
    hmm ....

    Der Versuch, das zweite Modul anzustupsen, führte zu demselben Ergebnis, jedoch für eine längere Zeit. Mana-Rauchen, Kicken des bekannten Knotennamens und verrücktes Glück führten zu dem Ergebnis: Aus irgendeinem Grund ist der Superadmin der Domain nicht authentifiziert, aber der für das Gast-Internet erstellte nicht autorisierte Benutzer hat funktioniert !
    Prost


    Es ist keine Zeit für ein Gerichtsverfahren - wir sind weiter gegangen.
    1. Git Init
    2. Lizenz
    3. Dirty Hack zum Debuggen
      require('nw.gui').Window.get().showDevTools();
      
    4. Kopieren-Einfügen von altem Code
    Voila

    Du kannst anfangen zu zaubern ... Aber fast eine Stunde ist vergangen. Das Baby kann jederzeit aufwachen. Für Magie ist keine Zeit - wir bereiten alles vor.
    Schnelles Googeln erwies sich als ausgezeichnetes Skript für die Arbeit mit der TinyTable- Tabelle . Ich kopiere es als Ganzes mit einem Beispiel für mich.
    Ein bisschen Code
    var ad = new ActiveDirectory(credentials.dn, credentials.dc, credentials.user, credentials.pass, {attributes: {user: [ 'cn', 'telephonenumber', 'mail' ]}}); // поменял эту строчку что бы доставало только ФИО телефон и мыло
    function users2table (users) {
      tablehtml = '';
      for (i in users) {
        var user = users[i];
        console.log(user);
        tablehtml+='';
        tablehtml+= ''+user.cn+''
        tablehtml+= ''+user.telephoneNumber+''
        tablehtml+= ''+user.mail+''
        tablehtml+=''
      }
      console.log(tablehtml);
      $('#table tbody').html(tablehtml);
      sorter.init();
    }
    
    DORT
    Es ertönte ein freudiger Schrei aus der Krippe.

    Folge 2: Morgenkaffee


    Um 6:50 habe ich ungefähr 20 Minuten ...

    1. Wir entfernen die Adressleiste und rufen das Fenster auf
      package.json
      "window": {
        "title": "Telephone Directory",
        "toolbar": false
      }
      
    2. Autofokus auf dem Suchfeld
      users2table
      $('#query').focus();
      
    3. Fügen Sie die Abteilung zum Tisch hinzu, oder besser gesagt, wir entfernen nicht nur alles, sondern nur den Namen, das Telefon, die E-Mail-Adresse und die Abteilung
      Versteckter Text
      var ad = new ActiveDirectory(credentials.dn, credentials.dc, credentials.user, credentials.pass, {attributes: {user: [ 'cn', 'telephonenumber', 'mail', 'department']}});
      
      tablehtml+= ''+user.department+''
      
    4. Und öffne das Fenster auf Vollbild, um nicht über die Größe zu baden
      Versteckter Text
      require('nw.gui').Window.get().maximize();
      
    Schon ganz gut
    Aber es ist schon halb acht und ich muss rennen.

    Folge 3: Wir fahren


    Während des Mittagessens kehrte ich zum Code zurück.
    Zuallererst habe ich eine Funktion hinzugefügt, über die ich bis zur Arbeit nachgedacht habe - Caching. Jedes Mal, wenn Sie auf einen Download warten (wenn auch nur wenige Sekunden), ist es ärgerlich, in ein leeres Fenster zu schauen.
    CODE
    im falle einer antwort von ldap wurde dies geändert:
    users2table(users);
    
    auf das:
       var localusers = localStorage.users;
       var ldapusers = JSON.stringify(users);
        if (localusers != ldapusers) {localStorage.users = JSON.stringify(users)} else {console.log('users didn\'t changed')};
        users2table(JSON.parse(localStorage.users));
    

    und auch zum leeren Platz im Skript hinzugefügt, der mit localstorage geladen wird, wenn er nicht leer ist
    if (localStorage.users) users2table(JSON.parse(localStorage.users));
    

    Ich habe ein paar Fehler behoben, es gekämmt, Mailto- Links für E-Mails hinzugefügt ... Im Grunde alles.
    FERTIG!
    Nur das Mittagessen endete.
    Diese Funktionalität deckt jedoch bereits alle meine Pläne vollständig ab, sodass ich vorerst aufgehört habe.

    Installation


    1. Put - node-webkit
    2. Release herunterladen
    3. Legen Sie die Datei private.js ab
      der Inhalt
      module.exports = {
           dn:"ldap://example.com"
          ,dc:"dc=example,dc=com"
          ,user:"user"
          ,pass:"pass"
      };
      
    4. starten
      path\to\nodewebkit\nw.exe path\to\telephone-directory
      


    Verteilung


    1. Packen Sie das Telefonverzeichnis in .zip
    2. Benennen Sie das Archiv in .nw um
    3. Magie
      copy /b path\to\nodewebkit\nw.exe+path\to\telephone-directory telephone-directory.exe
      
    4. Docken Sie alle anderen Dateien von node-webkit mit Ausnahme von nw.exe an das Verzeichnis mit telephone-directory.exe an

    Es sollte so aussehen:

    Alles - Sie können es auf ein Netzlaufwerk hochladen oder verteilen, wie Sie möchten

    PS

    Der Code wurde in Eile geschrieben, sodass er nicht vor Schönheit glänzt. Vieles kann und soll weiterentwickelt werden. Aber ohne die Hilfe der Community werde ich wahrscheinlich nicht mehr tun als das, was bereits da ist. Denn was schon existiert - funktioniert und erfüllt die Anforderungen voll und ganz - mehr ist nicht nötig.

    PPS

    Die Anwendung ist für ein Büro mit etwa 100 Mitarbeitern (wie das, in dem ich arbeite) konzipiert . Mit weniger wird AD kaum genutzt. Und bei einer größeren Version ist möglicherweise eine Optimierung des Codes erforderlich, aber das Korporal-Portal oder ähnliches wird wahrscheinlich bereits verwendet.

    PPPS

    Der Code besteht aus 45 Zeilen , daher bin ich mir sicher, dass es auch für Systemadministratoren, die JS nicht kennen, nicht schwierig sein wird, das Projekt an Ihre Bedürfnisse anzupassen.

    Jetzt auch beliebt: