标签:Console CharSet Server Window WriteLine SQL var using LOGON32
背景,需要在当前上下文中连接两个数据库,且两个数据库都需要使用不同的域账号登录。
首先注意到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); } } }
标签:Console,CharSet,Server,Window,WriteLine,SQL,var,using,LOGON32 来源: https://www.cnblogs.com/Qbit/p/14746282.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。