Stellen Sie eine Verbindung zur Domäne SQL Server 2005 von einer Nichtdomänenmaschine her her

8

Ich habe vor ein paar Tagen eine Frage gestellt ( Zugriff auf SQL Server 2005 von einem Nicht-Domänencomputer mit Windows-Authentifizierung ), der einige interessante, aber nicht verwendbare Vorschläge enthält. Ich möchte die Frage noch einmal stellen, aber mache klar, was meine Einschränkungen sind:

Ich verfüge über eine Windows-Domäne, in der ein Computer SQL Server 2005 ausführt und der nur für die Windows-Authentifizierung konfiguriert ist. Ich möchte eine C # -Client-Anwendung auf einem Computer im selben Netzwerk ausführen, der sich jedoch NICHT in der Domäne befindet, und auf eine Datenbank in der SQL Server 2005-Instanz zugreifen.

Ich kann weder OS- noch SQL Server-Benutzer auf beiden Computern erstellen oder ändern, und ich kann keine Änderungen an Berechtigungen oder Identitätswechsel vornehmen, und ich kann keine Runas verwenden.

Ich weiß, dass ich Perl- und Java-Anwendungen schreiben kann, die nur mit diesen vier Parametern eine Verbindung zur SQL Server-Datenbank herstellen können: Servername, Datenbankname, Benutzername (in der Form Domäne \ Benutzer) und Kennwort.

In C # habe ich verschiedene Dinge ausprobiert:

%Vor%

und versucht, integrierte Sicherheit auf wahr und falsch zu setzen, aber nichts scheint zu funktionieren. Ist das, was ich versuche, einfach unmöglich in C #?

Danke für jede Hilfe, Martin

    
user304582 12.05.2010, 20:17
quelle

7 Antworten

2

Wie Sie richtig sagen, können JDBC oder Perl auf einem Linux-Computer sowohl eine Verbindung zu einem SQL Server mit Windows-Authentifizierung als auch Anmeldeinformationen herstellen, die sich vom aktuell angemeldeten Benutzer unterscheiden. Das gilt übrigens auch für Windows CE-Geräte .

Ich denke, das ist, dass dies kein Problem von C #, sondern des SQL Server OLE DB-Treibers ist. Ich nehme an, die oben genannten Methoden "geben vor, eine Windows-Maschine zu sein, die einige spezifische Anmeldeinformationen verwendet" auf der Netzwerkebene; ein Feature, das dem SQL Server-OLE DB-Treiber fehlt. Daher wäre mein Vorschlag, nach einem alternativen (möglicherweise kommerziellen?) OLE DB-Treiber zu suchen, der auf SQL Server-Datenbanken zugreifen kann. Ich bin mir nicht sicher, ob so etwas existiert.

    
Heinzi 22.08.2010, 07:47
quelle
8

Ich hatte ein ähnliches Problem, als ich ein Tool schrieb, das auf einer Maschine in einer Domäne ausgeführt werden und mit einer SQL-Server in einer anderen Domäne mit einer vertrauenswürdigen Verbindung authentifizieren musste. Alles, was ich zu diesem Thema finden konnte, sagte, es sei nicht möglich. Stattdessen müssen Sie der Domäne beitreten, die SQL-Authentifizierung verwenden, sich an einem Kerb namens Kerberos beteiligen oder Ihre Netzwerkleute dazu bringen, eine vertrauenswürdige Beziehung einzurichten, um ein paar Alternativen zu nennen.

Die Sache ist, ich wusste, dass ich es irgendwie mit RUNAS arbeiten könnte, weil ich es mit SSMS bewiesen hatte:

%Vor%

Das / netonly-Flag erlaubte mir, die EXE mit den lokalen Zugangsdaten auszuführen und auf das Netzwerk mit den Remote-Zugangsdaten zuzugreifen, denke ich, trotzdem habe ich die Ergebnismenge erhalten, die ich von dem entfernten Server erwartet hatte. Das Problem war, dass der Runas-Befehl es sehr schwierig machte, die Anwendung zu debuggen, und es roch nicht gut.

Schließlich fand ich diesen Artikel auf dem Code-Projekt , in dem es um die Authentifizierung von Active Directory ging, Hier ist die Hauptklasse, die den Identitätswechsel durchführt:

%Vor%

Um es nur zu verwenden:

%Vor%

Ich habe die Undo-Methode hinzugefügt, da sonst das Impersonator-Objekt dazu tendiert, den Müll zu sammeln. Ich änderte auch den Code, um LOGON32_LOGON_NEW_CREDENTIALS zu verwenden, aber das war ein Sack und lief, um es zu arbeiten; Ich muss immer noch vollständig verstehen, was es tut, ich habe das Gefühl, es ist das gleiche wie die / netonly Flagge auf Runas. Ich zerlege auch den Konstruktor ein wenig.

    
Stephen Turner 19.01.2011 14:39
quelle
4

Es ist nutzlos, den Benutzernamen und das Kennwort in der Verbindungszeichenfolge anzugeben, da dies die SQL-Authentifizierung impliziert, und Sie haben bereits angegeben, dass SQL Server nur die Windows-Authentifizierung akzeptiert.

Wenn der Server keine SQL-Authentifizierung zulässt, besteht die Möglichkeit, die only Verbindung herzustellen, die Verwendung der Windows-Authentifizierung, d. %Code%. Dies bedeutet, dass sich Ihr Client authentifiziert, unabhängig davon, welche Anmeldeinformationen den Prozess ausführen (oder gerade imitiert werden).

Damit die Windows-Authentifizierung funktioniert, müssen Sie eine der folgenden Optionen auswählen:

  • Verbinden Sie den nicht mit Domäne verbundenen Computer mit einer Domäne (es kann eine eigene Domäne sein!), die der Serverdomäne vertraut, und führen Sie dann den Clientprozess als Domäne \ Benutzerberechtigung aus.
  • Verwenden Sie gespiegelte NTLM-Konten: ein Paar lokaler Benutzer auf dem Client und dem Server mit identischem Namen und identischen Passwörtern.
  • Erteilen Sie als ANONYMOUS Zugriff auf den SQL Server.

Wenn Sie nicht zulassen können, dass der Clienthost der Serverdomäne vertraut oder NTLM-gespiegelte Konten hinzugefügt werden können und der SQL Server-Administrator vernünftig genug ist, ANONYMOUS nicht zu aktivieren, können Sie keine Verbindung herstellen.

    
Remus Rusanu 12.05.2010 20:34
quelle
2

Sie müssen SQL Server konfigurieren , um die SQL Server-Authentifizierung zuzulassen, dh die Authentifizierung mit Benutzername und Passwort.

Sie können sich nicht nach der "Like" -Serverauthentifizierung von Domain-Benutzername / Passwort authentifizieren, d. h. Domain-Nutzername / Passwort direkt angeben.

Ich kann natürlich falsch liegen, aber ich bin mir sicher, dass dies kein Problem von C # oder .NET ist. Wie können Sie sich auf SQL Server in Ihrer Perl- oder Java-Anwendung anmelden?

    
abatishchev 12.05.2010 20:22
quelle
0

Ich gebe Ihnen die Java-Antwort, mit der ich vertrauter bin: Ich verwende den jTDS-JDBC-Treiber mit den vier oben genannten Parametern. Die Perl-Anwendung, über die ich weniger weiß, läuft aber auf einer Linux-Box und kann sich mit den gleichen Parametern verbinden. Ich kann den SQL Server nicht zur Unterstützung der SQL-Authentifizierung ändern.

Um Remus 'Vorschläge zu beantworten, kann ich keines dieser drei Dinge tun, die er vorschlägt, und doch können Java- und Perl-Anwendungen eine Verbindung herstellen. Irgendwelche anderen Ideen?

Danke, Martin

    
user304582 12.05.2010 20:52
quelle
0

Ist es eine Option, zur Eingabe von Anmeldeinformationen aufzufordern?

    
Chris Haas 12.05.2010 21:11
quelle
0

Hier ist der Beispielcode, den ich verwende, um von einem Nicht-Domain-Rechner mit dem jTDS-JDBC-Treiber eine Verbindung herzustellen:

Class.forName ("net.sourceforge.jtds.jdbc.Driver"). newInstance (); String url="jdbc: jtds: sqlserver: // Server / Datenbank; Domäne = Domäne"; conn = DriverManager.getConnection (URL, "Benutzer", "Kennwort");

    
user304582 12.05.2010 22:23
quelle