Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
In Applikation Teilbereiche als anderer user ausführen
oehrle
myCSharp.de - Member



Dabei seit:
Beiträge: 430
Herkunft: Germany

Themenstarter:

In Applikation Teilbereiche als anderer user ausführen

beantworten | zitieren | melden

Hallo Community, bin mir nicht sicher ob die Überschrift das Thema korrekt trifft, aber ich beschreibe mal mein Problem.

Ich habe sämtliche Applikationen, bei denen die Berechtigungen und Zugriffe wegen Useraccouts sich verändern. Normalerweise werden Berechtigungen über den Windowsuser geregelt, wenn es um Schreib- oder Lesezugriffe auf unseren Fileservern geht.
Außer bei SQL-Datenbankkommunikation werden andere Benuttzer verwendet.

Jetzt muss aus IT-Sicherheitstechischen Gründen sämtliche Bereiche auf die zugegriffen wird nur noch mit lokalen Usern arbeiten.
Ich habe zum Beispiel ein Appliaktion, die holt sich Daten vom SQL-Server, das geht alles noch, weil ich da einen expliziten User bei der Verbindung einsetzen kann.
Ich verarbeite die Daten, muss dann die Ergebnisse in einer Datei auf dem Fileserver ablegen, das hat bisher ganz normal mit meinem Windows-User aus der Domäne funktioniert.

Wenn ich jetzt am Entwickeln der Anwendung bin, kann ich ja die Datei nicht wegschreiben, weil ich mit meinem Windows-User die Applikation (VisualStudio) am Laufen habe.
Gibt es die Möglichkeit, in der Anwendung einen anderen User (den lokalen User vom Fileserver) vorzuschalten ??

Ich hoffe man kann den Stuss verstehen, den ich geschrieben habe.

Wenn die Applikation von einem Kollegen ausgeführt wird, dann kann er ja die Applikation unter dem lokalen User starten.
Aber wenn ich entwickle, wie mache ich es dann? Gibt es da Möglichkeiten, den User im Code zu wechseln ??

Oder Visual Studio als anderen User zu starten ??


Habe Visual Studio probiert, unter dem lokalen User mit "Runas different User" zu starten, leider ohne Erfolg, denn: Mein Rechner kennt den lokalen User gar nicht.

Wenn ich im Code eine Datei erstelle mit File.Wite / File.xxxx gibt es da auch die Möglichkeit einen anderen User für diesen Teilbereich vorzuschalten?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von oehrle am .
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.026

beantworten | zitieren | melden

Sowas nennt sich Impersonation. Wenn ihre bereits Azure Active Directory bzw. eine dazugehörige Token-Authentifizierung habt, dann wird das jedoch in der Regel über den On Behalf Flow umgesetzt.
Dazu muss jedoch Deine gesamte Anwendung Teil der Domäne sein und die Eigenheiten von Active Directory auch unterstützen können, was in diesem Fall schon beim Webserver beginnt. Denn dieser muss Teil der Domäne sein, der IIS muss für Domain Authentication konfiguriert sein und Deine Anwendung muss aktiv die Windows Impersonation unterstützen können.
Nur dann kannst Du Dinge auf anderen Ressourcen als Benutzer ausführen.

Bei Desktop-Anwendungen ähnlich, nur dass halt der User der aktuellen Windows Anmeldung dafür verwendet wird statt die IIS Features.

PS: Benutzerberechtigungen Deiner Anwendungen haben im SQL Server nichts zu suchen.
Zitat
Gibt es die Möglichkeit, in der Anwendung einen anderen User (den lokalen User vom Fileserver) vorzuschalten ??
Nein, "nicht einfach so aus dem Himmel".
Du brauchst immer den Kontext eines Users, um diesen "impersonaten" zu können.
Impersonates the user represented by the WindowsIdentity object.
private Nachricht | Beiträge des Benutzers
oehrle
myCSharp.de - Member



Dabei seit:
Beiträge: 430
Herkunft: Germany

Themenstarter:

beantworten | zitieren | melden

MMhhh. Hab ichmir schon gedacht das es nicht einfach wird. Also ob wir was mit Azure Active Directory nutzen, keine Ahnung, muss mal bei der IT nachfragen. WIr identifizieren uns jedenfalls mit 2-Faktorauthentifizierung, aber denke das hat nichts mit deiner besagten Tokennauthentifizierung zu tun.

Das nächste wäre, wie ich dann meine Applikation als Dömänenteil hingebogen ??

Also es handelt sich um eine Desktopanwendung FW 4.5. Webserver nutze ich nicht, WPF-Applikation.

Die andere Möglichkeit, ich entwickle schön weiter, erstelle Files während der Entwicklung auf einem Verzeichnis auf das ich Zugriff habe.
Wenn die Anwendung bei den Kollegen verwendet wird, kann diese ja mit dem anderen Benutzer (lokaler Benutzer) ausgeführt werden, je anchdem ist der Kollege mit diesem lokalen Benutzer am System sogar angemeldet.
Aber richtig gefallen tut mir das nicht.
Angenommen ich mache das so, mein Kollege hat ein Problem und ich schalte micht auf seinen Rechner um die Applikation zu debuggen. Geht das dann überhaupt oder gibt es dann da auch schon Probleme?
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.026

beantworten | zitieren | melden

Zitat
Angenommen ich mache das so, mein Kollege hat ein Problem und ich schalte micht auf seinen Rechner um die Applikation zu debuggen. Geht das dann überhaupt oder gibt es dann da auch schon Probleme?
So generelle Fragen kann man nie beantworten.

Was halt niemals geht ist, dass Du Dich mit einem User impersonieren sollst, der nur lokal auf einer anderen Maschine bekannt ist.
Wenn ein User A nur auf Maschine X bekannt ist, dann ist er eben nur da bekannt und nirgends anders.
private Nachricht | Beiträge des Benutzers
prokrammer
myCSharp.de - Member



Dabei seit:
Beiträge: 3

Impersonation Problem

beantworten | zitieren | melden

Hallo Abt, musste mich ummelden, mein Account geht nicht mehr, Mail für neues Passort bekomme ich auch nicht. Bin mir auch nicht sicher ob das mit FireFox zusammenhängt ... erst mal egal.

Zu dem Problem mit Impersonation, habe ich einige Dinge gefunden, auch Beispiele die ich getestet habe eines mal hier:

https://learn.microsoft.com/en-us/dotnet/api/system.security.principal.windowsidentity.impersonate?redirectedfrom=MSDN&view=netframework-4.0#System_Security_Principal_WindowsIdentity_Impersonate_System_IntPtr_

Nun nochmal zur Problembeschreibung. Ich verwende hier eine Desktopanwendung in WPF mit FW4.0, das mache ich noch aus Gründen weil, nicht lachen ... wir noch ein paar WINXP-Maschinen auf Maschinenrechnern haben. Das hat sich aber auch bald erledigt ...

Dazu haben wir ein Firmennetzwerk mit ActiveDirectory, hier sind eigentlich alle User im Fimennetz drin.
Dann haben wir ein Maschinennetz, getrennt vom Firmennetz, aus Sicherheitstechnischen Gründen.
Für das Maschinennetz gibt es einen Fileserver, auf dem die Maschinen Daten abholen und ablegen können. Bisher konnte auch begrenzt User aus dem Firmennetzwerk auf diesen Fileserver Daten ablegen (für die Maschinen) oder abholen.

Nun muss aber dieser Fileserver komplett vom Firmennetzwerk getrennt werden, also lokal. Dann sind auf dem Fileserver lokale Benutzer angelegt, die haben dann Rechte auf bestimmte Verzeichisse.

Jetzt habe ich das Problem, das ich mit meinem normalen Firmennetzuser kein Zugriff mehr auf diesen Fileserver habe.
Dazu hätte ich gerne die Impersoantion genutzt, und zwar in dem Moment, wenn ich eine Datei schreiben muss, hätte ich den lokalen User mit seinem Passwort und der Daomainzugehörigkeit verwendet.

Aber leider ohne Erfol, bei "returnValue" ist der Rückgabewert immer "0", unten ein Codestück von dem Beispiel.


// Call LogonUser to obtain a handle to an access token.
            bool returnValue = LogonUser(userName, domainName, Console.ReadLine(),
                LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
                out safeTokenHandle);

            Console.WriteLine("LogonUser called.");

            if (false == returnValue)   // ==> returnValue immer 0
            {
                int ret = Marshal.GetLastWin32Error();
                Console.WriteLine("LogonUser failed with error code : {0}", ret);
                throw new System.ComponentModel.Win32Exception(ret);
            }
            using (safeTokenHandle)

Ich hatte auch mal noch ein anderes Beispiel benutzt, das war etwas ausführlicher mit besserer Fehlermeldung, da kam die Message, das der User oder das Passwort falsch sei.
Hatte ich mehrfach überprüft, ging nicht.

Dann noch ein Hinweis: Ich hatte vesucht bei mir am Rechner den Bereich als Netzlaufwerk zu verbinden, mit den Userdaten des lokalen Users, das hat auch nicht funktioniert.
Fällt euch dazu noch etwas anderes ein, an was es scheitern könnte ??

Von dem AzureActiveDirectory oder der Tokenauthentifizierung war in den anderen Beispielen nichts zu sehen / lesen ....
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.026

beantworten | zitieren | melden

Du hast nen übliches Setup im Maschinenbau, ich komm auch da her. Nur ist eure Isolation komisch....
Zitat
Jetzt habe ich das Problem, das ich mit meinem normalen Firmennetzuser kein Zugriff mehr auf diesen Fileserver habe.
Dazu hätte ich gerne die Impersoantion genutzt
Das sind dann offenbar bewusst isolierte Maschinen; die können dann eben von außen auch nicht verwendet werden.
Die Authentifizierung geht dann auch nur lokal.

Gerade nochmal gegoogelt, zumindest geht das offenbar mit advapi32
using-advapi32-dlllogonusera-to-impersonate-a-remote-machines-local-user
Zitat
Ich hatte vesucht bei mir am Rechner den Bereich als Netzlaufwerk zu verbinden, mit den Userdaten des lokalen Users, das hat auch nicht funktioniert.
Damit aber Remote Auth geht, muss das konfiguriert sein.

Kann mir vorstellen, dass das bewusst nicht aktiv ist - sonst würde man ja die lokalen User untergraben.
Und Username:Password handlich ist ja gerade das unsichere, was man vermeiden will...
private Nachricht | Beiträge des Benutzers
Alf Ator
myCSharp.de - Member



Dabei seit:
Beiträge: 671

beantworten | zitieren | melden

Hallo prokrammer
Zitat von prokrammer
Dann noch ein Hinweis: Ich hatte vesucht bei mir am Rechner den Bereich als Netzlaufwerk zu verbinden, mit den Userdaten des lokalen Users, das hat auch nicht funktioniert.
Fällt euch dazu noch etwas anderes ein, an was es scheitern könnte ??

Ich hatte damals, einen Service im Netz laufen lassen, an den die Maschinen ihre Daten senden konnten.

Gruß
Alf
private Nachricht | Beiträge des Benutzers
prokrammer
myCSharp.de - Member



Dabei seit:
Beiträge: 3

beantworten | zitieren | melden

Wie hat der Service / Dienst funktioniert??
Dei übergeordnete IT macht uns das immer schwerer, auch immer mehr alles voneinander zu trennen. Nur wie soll man da noch direkt was übertragen? Daten müssen halt von A nach B kommen.
Was käme da noch in Frage? Das über einen Webservice machen? Habe ich das mehr Sicherheit, Entkopplung der Systeme? Oder welche Möglichkeiten gäbe es noch ??

Was ich nun noch probiere, ist ein temporäres Netzlaufwerk mit NET USE zu verwenden. Im Code kann ich das anlegen, dann ist es da. Aber das Passwort ist halt so irgendwo offen hinterlegt.
Das müßte man noch verschlüsseln und entschlüsseln können, das habe ich noch nie gemacht.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.026

beantworten | zitieren | melden

Zitat von prokrammer
Nur wie soll man da noch direkt was übertragen? Daten müssen halt von A nach B kommen.
Deine Verantwortung ist eben das Konzept den Sicherheitsregeln anzupassen.
Im Endeffekt beschwerst Dich, dass andere sicherer werden, aber selbst willst gleich bleiben. Das kollidiert halt.

Zum Beispiel widerstrebt es jeder Sicherheitsgrundlage, dass Du etwas von Außen auf eine Maschine pumpen musst.
Wie wärs mit einem Ansatz, dass die Maschine sich etwas von Außen holt? Wie wärs auf infrastrukturelle Dinge wie Shares zu verzichten und moderne Speicheraustauschsysteme zu verwenden oder sowas (ein bisschen) nachzubauen?

Und ja - im Maschinenbau heisst das leider sehr oft, dass bestehende Dinge vollständig weggeschmissen werden müssen.
Viele Maschinenbauer leben 20 Jahre von ihrer IT Substanz, viel wird Inhouse entwickelt statt fertiges, standardisiertes Zeug zu nehmen - und wundern sich, dass es dann nen Big Bang gibt.
Zitat von prokrammer
das habe ich noch nie gemacht.
Egal ob das nun neue Anforderung, Sicherheit, Verschlüsselung Architektur etc etc ist. Was auch immer.
Kannst Du es nicht, dann musst es lernen oder Dir Hilfe ins Haus holen :-)
Weiterbildung gehört zum Job.
private Nachricht | Beiträge des Benutzers
prokrammer
myCSharp.de - Member



Dabei seit:
Beiträge: 3

beantworten | zitieren | melden

Hallo Abt, was wäre denn deiner Meinung eine gute Möglichkeit, Dateien von Server A nach Server B auszutauschen? Wäre da ein WebService hilfreich?
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.026

beantworten | zitieren | melden

Steht direkt ein Beitrag drüber, in meiner letzten Antwort.
Zitat
Zum Beispiel widerstrebt es jeder Sicherheitsgrundlage, dass Du etwas von Außen auf eine Maschine pumpen musst.
Wie wärs mit einem Ansatz, dass die Maschine sich etwas von Außen holt? Wie wärs auf infrastrukturelle Dinge wie Shares zu verzichten und moderne Speicheraustauschsysteme zu verwenden oder sowas (ein bisschen) nachzubauen?
Welche Art von Implementierung die richtige ist, das musst evaluieren. Das kann Dir hier im Endeffekt niemand mit der Glaskugel sagen. Ein Forum kann bei konkreten Probleme helfen, aber Evaluierungen können wir für Dich nicht übernehmen.
Wir kennen alle die Anforderungen an eure IT/Netzwerk/Umgebung/Software/Features nicht.

Ein Webservice (vermutlich meinst HTTP Service) kann die richtige Wahl sein; muss aber nicht.
private Nachricht | Beiträge des Benutzers