Outlook Add-In - wie alte Versionen nicht mehr nutzbar machen

  • VB.NET

Es gibt 35 Antworten in diesem Thema. Der letzte Beitrag () ist von MK_CGN.

    Outlook Add-In - wie alte Versionen nicht mehr nutzbar machen

    Hallo zusammen,
    der Titel des Beitrages ist vielleicht nicht ganz so erklärend, aber ich fand es nicht einfach es zu beschreiben.
    Ich habe ein Outlook Add-In programmiert, was funktioniert. Dieses ist derzeit an 10 Mitarbeiter verteilt.
    Jetzt würde ich gerne eine Sicherheit einbauen, so dass die Möglichkeit besteht, einen der 10 Mitarbeiter auszuschließen, dies zu nutzen, weil er eventuelle nicht mehr in der Firma bzw. in der Funktion tätig ist.

    Über Environment.Username kann ich ja den Windows Anmeldennamen auslesen und diesen dann in einer Case Anweisung die Erlaubnis erteilen, dass Programm zu nutzen.
    Aber wie gehe ich jetzt am cleversten vor, wenn ein User - wie oben beschrieben - nicht mehr für die Nutzung zugelassen ist? Dann muß ich ja eine neue Version verteilen, wo der User dann in der Case Anweisung nicht mehr enthalten ist.
    Wenn er jetzt allerdings das Add-In nicht aktualisiert - wir machen eine manuelle Verteilung einer neuen Version - dann hat er ja weiterhin vollen Zugriff.

    Ich hoffe ich konnte mich klar ausdrücken, mit meinem Anliegen.

    Über Vorschläge würde ich mich freuen.
    @MK_CGN Auf welchem Rechner läuft das Plugin?
    Du kannst doch das ganze mit einer Server-Abfrage lösen, wo eine (verschlüsselte) Liste mit erlaubten / angemeldeten Usern liegt, die abgefragt werden muss
    oder
    ein Teil des Plugins (eine DLL) muss von einem Server geladen werden mit denselben Restriktionen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Sind das zentral verwaltete Benutzer (in einer Domain)?
    Sind das Exchange-User?

    Was macht denn das Add-In, was der User nicht mehr können soll?
    Auf welche Daten greift es zu?

    Die Idee von Sicherheit ist nicht, dass sich das Add-In schützt, sondern dass unerlaubte Datenzugriffe zurückgewiesen werden.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    @MK_CGN Dann solltet Ihr zunächst ein Login-System bauen, wo nur autorisierte Nutzer zugreifen können.
    Üblicherweise kommt die nächste Änderung, die dies erfordert, mit Sicherheit, da ist es wirklich sinnvoll, solch Zentralverwaltung primär anzugehen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @MK_CGN Habich leider nicht, ich programmiere die Ansteuerung von Hardware, nicht aber Datenbanken.
    Das jedoch wäre meine Forderung an die, die das programmieren müssen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Kein DB-System ist so elegant in Windows integriert wie Microsoft SQL Server.
    Das unterstützt notfalls sogar Zugriff auf einzelne Records, basiert auf dem Windows-Login.
    Für deinen Fall wird es aber wahrscheinlich reichen, den Datenbankzugriff an sich für bestimmte Benutzergruppen zuzulassen (oder zu blockieren).
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Okay dann habe ich allerdings noch eine Frage / Problem:

    Bisher stelle ich die Verbindung über einen angelegt MSSQL USER mit folgenden Code her:

    Quellcode

    1. ' Herstellen der Verbindung zur MSSQL Datenbank
    2. Dim Connection As New SqlConnection("SERVER=IP-ADRESSE;database=DB_1;UID=Username;Pwd=*****")
    3. ....


    Die Verbindung funktioniert und ich kann im Nachgang auch Abfragen etc. starten.
    Wenn ich dies nun Userbezogen erstellen will, habe ich es mit folgendem Code probiert:

    Quellcode

    1. Dim DB_Username = Environment.UserName
    2. ' Herstellen der Verbindung zur MSSQL Datenbank
    3. Dim Connection As New SqlConnection("SERVER=IP-ADRESSE;database=DB_1;UID=" & DB_Username & ";Pwd=*****")
    4. ...


    Allerdings wird keine Verbindung aufgebaut, es erscheint aber auch keine Fehlermeldung.
    Was mache ich falsch?
    Prüf mal die Berechtigungen des Users auf der Datenbank. Und wenn das nichts ergibt dann probier mal folgendes:

    VB.NET-Quellcode

    1. ConnectionString = String.Concat("Data Source=IP-ADRESSE;Initial Catalog=DB_1;User Id=",DB_Username,";Password=********;")


    Nur als Beispiel, ist natürlich Quatsch, den Username variabel zu machen und das Passwort fest zu coden.

    Kurze Frage noch. Der Username der in Environment.UserName steht ist aber schon auf der Datenbank als Datenbank-Benutzer hinterlegt oder?


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.
    Ja aber wenn es ein Anmeldeproblem wäre, dann würde es eine Fehlermeldung geben. Es sei denn du hast das in Try Catch gesetzt. Hast du mal einen BreakPoint gesetzt und bist mit dem Debugger durchgesteppt?

    Andernfalls mal die Userberechtigungen auf dem DB checken. Vielleicht gibt er keine Werte zurück, weil Berechtigungen fehlen.


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.
    Wenn ich mich mit dem Windows User direkt am SQL Server Management Studio anmelden will erhalte ich die Meldung:

    Cannot connect to Server
    Login to Microsoft SQL Server Error: 18456

    Im Quellcode habe ich jetzt folgendes:

    Quellcode

    1. Dim Connectionstring As String
    2. ' Herstellen der Verbindung zur MSSQL Datenbank
    3. Connectionstring = String.Concat("SERVER=IP-ADRESSE;database=DB_1;Integrated Security=true")
    4. MsgBox(ConnectionState.Open)


    Wenn ich dann einen Haltepunkt setze und mich durch den Code trigger, dann erhalte ich bei der Msgbox eine "1". Was, wenn ich das richtig verstehe, bedeutet, dass die Verbindung hergestellt ist.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „MK_CGN“ ()

    Okay, also direkt aus dem AD importiert.

    Dann ist die Anmeldung nicht ganz so einfach. Zunächst empfiehlt es sich, sich grundlegend mit diesen Namespaces

    VB.NET-Quellcode

    1. System.Security.Principal
    2. System.Security.Permissions


    und AD-Integration in deine Form zu beschäftigen, denn einfach das Passwort leer lassen funktioniert nicht. Hier ist ein Beispiel dazu das sich mit diesem Thema beschäftigt.

    docs.microsoft.com/en-us/dotne…mpersonate_System_IntPtr_

    Alles was bei AD-Integration über das auslesen von Domaindaten hinausgeht enzieht sich leider meinem Kenntnisstand. Hier muss dir wer anders helfen.


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.
    Für DB-Zugriffe habe ich noch nie Impersonate benötigt.
    Wenn der ausführende User in der DB als AD-User eingetragen ist, reicht der ​Integrated Security Ansatz.
    Impersonate brauchst du nur, wenn du als User unter anderem Namen den DB-Zugriff machen willst.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    petaod schrieb:


    Impersonate brauchst du nur, wenn du als User unter anderem Namen den DB-Zugriff machen willst.


    Wie gesagt ist absolut nicht mein Spezialgebiet. Ich hätte allerdings erwartet, dass ich für die Übergabe des Passworts Imposonate benötige. Das ich bereits den ConnectionString mit Integrated Security übergeben kann, hab ich gar nicht drüber nachgedacht :D Wieder was gelernt.


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Yanbel“ ()

    Ich habe den Connect zur Datenbank wie folgt programmiert:

    Dim Connection As New SqlConnection("SERVER=IP_ADRESSE;database=DB_1;Integrated Security=true")

    Allerdings erhalte ich jetzt folgende Fehlermeldung:
    System.Data.SqlClient.SqlException: "Netzwerkbezogener oder instanzspezifischer Fehler beim Herstellen einer Verbindung mit SQL Server. Der Server wurde nicht gefunden, oder auf ihn kann nicht zugegriffen werden. Überprüfen Sie, ob der Instanzname richtig ist und ob SQL Server Remoteverbindungen zulässt. (provider: Named Pipes Provider, error: 40 - Verbindung mit SQL Server konnte nicht geöffnet werden)"


    Der ausführende User hat aber die Berechtigung im SQL Management Studio für die Datenbank. Muss ich sonst noch ein Recht vergeben?

    Habe ich aber einen SQL internen User vergeben und Frage mit UID und PW ab, funktioniert es.