Guten Tag, ohne zu versuchen,C#: Überprüfen, ob Benutzer den Zugriff auf Server Hat Verbindung
Ich bin derzeit ein Problem konfrontiert, wo ich eine Liste von Servernamen haben, und ich brauche, um zu überprüfen, dass ein Windows-authentifizierten Benutzer hat Berechtigungen die angegebenen Servernamen, ohne zu versuchen, eine Verbindung zum angegebenen Server herzustellen, bevor ich ihnen die Liste der Server vorstelle. So zum Beispiel:
Server: A, B, C, D
Joe hat Berechtigungen A und D, aber nicht B und C so Joe sollte nur A und D in seiner Serverliste.
Wie soll ich dieses Problem angehen? Soll ich aus Active Directory ziehen? Ich weiß, wie ich die Identität meines Benutzers ermitteln kann, aber wo die Serverinformationen abgerufen werden und ob ein Benutzer Berechtigungen hat, ist eine völlig andere Geschichte. Jede Dokumentation, Codebeispiele, Artikel usw. sind hilfreich.
Hinweise über die Arbeitsumgebung
- alle Server in der Liste sind Datenbankserver SQL Server 2008 R2 und höher.
- Dies ist eine Regierungsumgebung, in der es starke Einschränkungen gibt.
- Ich kann Active Directory in keiner Weise ändern.
- Ich kann Active Directory und SQL Server den ganzen Tag abfragen, vorausgesetzt der Benutzer verfügt über Berechtigungen.
- Die Verwendung von Bibliotheken und Tools von Drittanbietern ist nicht gestattet.
Side Hinweis über die Serverliste
Diese Liste in einer Datenbank gespeichert ist, aber ich glaube nicht, das wirklich mit der Berechtigungsseite hilft. Ich habe bereits gelöst, die Frage des mit der folgenden SQL-Abfrage Berechtigungen gegen die einzelnen Datenbanken Überprüfung:
SELECT name
FROM sys.databases
WHERE HAS_DBACCESS(name) = 1
ORDER BY name
Vielen Dank für Ihre Hilfe!
-Jamie
Fazit
Im Wesentlichen habe ich keine Möglichkeit gefunden, die AD-Gruppen auf dem Remote-Server abzufragen, ohne zu versuchen, eine Verbindung herzustellen, so dass die Ausführung aller Proben gefunden wird das Benutzerkonto mit IA kennzeichnen. Für andere mit einem ähnlichen Problem, die sich nicht darum kümmern müssen, dass IA einen Hammer auf die Benutzer fallen lässt, habe ich ein paar Lösungen darunter eingefügt, die versuchen können, Ihre Anforderungen zu erfüllen (alle folgenden werden funktionieren, wenn sie korrekt implementiert werden).
Lösungen
- Abfrage der Server in Active Directory und die Gruppen vom Server abrufen, wenn diese 9mal Nachricht von zehn die Ausnahme versagt wird ‚Zugriff verweigert.‘.Wenn es erfolgreich ist, fahren Sie fort, die Gruppen des aktuellen Benutzers zu ziehen und mit den Gruppen zu vergleichen, die vom Server gezogen werden. Die ausgewählte Antwort auf diesen Beitrag kombiniert mit und/oder this post bringt Sie dorthin, wo Sie mit dieser Lösung sein müssen.
Wenn Sie den Zugriff auf den Server haben bereits durch impersonation oder andere Mittel (SQL Server Auth), dann können Sie folgendes sehen verwenden, wenn das Mitglied zugeordnet alle Serverrollen hat:
SELECT IS_SRVROLEMEMBER('public')
Sie könnten auch Verwenden Sie das in der Microsoft.SqlServer.Smo-Assembly verfügbare Login class, das den Namespace Microsoft.SqlServer.Management.Smo verwendet. Sie haben jedoch möglicherweise Probleme, den Microsoft.SqlServer.SqlClrProvider-Namespace von dem GAC zu dem BIN zu verschieben. Weitere Informationen hierzu finden Sie unter this StackOverflow post und bei this Microsoft Connect Thread gefunden werden, die besagt Folgendes:
Client-Anwendungen sollten nicht die Baugruppen aus den Programmdateien-Ordner verwenden, sofern sie nicht von dem spezifischen SDK sind Ordner (zB "C: \ Program Files (x86) \ Microsoft SQL Server \ 130 \ SDK")
Sie könnten einen grundlegenden Verbindungstest in einem selbst tun gewickelt versuchen Sie zu fangen, um zu sehen, ob die Verbindung funktioniert.
using (SqlConnection conn = new SqlConnection(connString)) { try { conn.Open(); conn.Close(); } catch (Exception e) { Console.Write($"Connection test failed: {e.Message}"); } }
eine kleine Vielzahl von Möglichkeiten gibt es das übergeordnete Ziel zu erreichen, es kommt nur darauf an Ihrer Situation und wie wollen Sie es nähern. Für mich wird keine der Lösungen funktionieren, da der Test in jedem Szenario eine Verbindung zu dem fraglichen Server versucht, der den Benutzer aufgrund fehlender Berechtigungen kennzeichnet.
Meinen Sie wollen Sie gegen Syslogins der einzelnen Server überprüfen? – SchmitzIT
Ich muss überprüfen, ob ein Benutzer Zugriff auf einen Datenbankserver hat. Ich würde annehmen, dass es keine SQL-Abfragen gibt, aber es wäre schön, wenn es da wäre. Ich gehe davon aus, dass dies höchstwahrscheinlich eine Active Directory-Abfrage ist. – lxxtacoxxl
Nun, sys.server_principals enthält Informationen darüber, welche Benutzer auf dem Server erstellt wurden. Sie können Ihre SQL Server immer abfragen, wenn sich ein Benutzer anmeldet, und nur diejenigen anzeigen, denen sie als Benutzer mit Zugriff hinzugefügt wurden. Nicht sicher, ob es einen besseren AD-Weg gibt, aber Sie müssen die beiden möglicherweise kombinieren, da SQL auch Mitglieder von Gruppen akzeptieren kann – SchmitzIT