Window 模拟其他用户操作 SQL Server
2021/5/9 2:27:13
本文主要是介绍Window 模拟其他用户操作 SQL Server,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
背景,需要在当前上下文中连接两个数据库,且两个数据库都需要使用不同的域账号登录。
首先注意到SqlConnection 对象有个重载的方法,但看了描述貌似不支持 Windows 集成身份验证。
经测试,确实不支持
那么尝试另外的方法,尝试用C#代码使用另外的用户登录,然后使用新用户的上下文执行一些操作,完整代码如下,需要使用管理员账号执行。当然,该操作不仅限于连接数据库
using Microsoft.Win32.SafeHandles; using System; using System.Data.SqlClient; using System.Runtime.InteropServices; using System.Security.Principal; namespace ConsoleApp2 { class Program { [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)] public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, out SafeAccessTokenHandle phToken); [DllImport("kernel32.dll", CharSet = CharSet.Auto)] public extern static bool CloseHandle(IntPtr handle); static void Main(string[] args) { //var conn = new SqlConnection(); var userName = "xxxx"; var password = "xxxxx"; var domainName = "xxxxx"; const int LOGON32_PROVIDER_DEFAULT = 0; //This parameter causes LogonUser to create a primary token. const int LOGON32_LOGON_INTERACTIVE = 2; SafeAccessTokenHandle safeAccessTokenHandle; bool returnValue = LogonUser(userName, domainName, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, out safeAccessTokenHandle); Console.WriteLine("模拟前:"); Console.WriteLine("Current User:" + WindowsIdentity.GetCurrent().Name); WindowsIdentity.RunImpersonated(safeAccessTokenHandle, () => { Console.WriteLine("模拟中:"); Console.WriteLine("Current User:" + WindowsIdentity.GetCurrent().Name); try { var conn = new SqlConnection("Server=h90sv31000211db.zh.if.atcsg.net\\AP_ADW;Database=DataWhs;Trusted_Connection=SSPI;" ); conn.Open(); var cmd = new SqlCommand("select 1", conn); Console.WriteLine(cmd.ExecuteScalar()); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } }); Console.WriteLine("模拟后:"); Console.WriteLine("Current User:" + WindowsIdentity.GetCurrent().Name); } } }
这篇关于Window 模拟其他用户操作 SQL Server的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-01-08Docker下的SqlServer发布订阅启用
- 2023-06-05Docker安装MS SQL Server并使用Navicat远程连接
- 2023-05-25深入浅出 SQL Server CDC 数据同步
- 2023-05-12通过空间占用和执行计划了解SQL Server的行存储索引
- 2023-04-24以SQLserver为例的Dapper详细讲解
- 2022-11-30SQL server高级函数查询
- 2022-11-26SQL SERVER数据库服务器CPU不能全部利用原因分析
- 2022-11-21SQL Server 时间算差值/常用函数
- 2022-11-20调试Archery连接SQL Server提示驱动错误
- 2022-10-22SQL Server 完整、差异备份+完整、差异还原(详细讲解,规避错误)