代码加注释,由于在.NET Core中也是支持PInvoke调用Win32库的,所以下面的代码也适用于.NET Core程序:
using System; using System.IO; using System.Runtime.InteropServices; using System.Security.Principal; namespace NetCorePrincipal { internal static class WinLogonHelper { /// <summary> /// 模拟windows登录域 /// </summary> [DllImport("advapi32.DLL", SetLastError = true)] public static extern int LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken); } class Program { static void Main(string[] args) { IntPtr admin_token = default(IntPtr); WindowsIdentity wid_admin = null; WindowsImpersonationContext wic = null; //在程序中模拟域帐户登录 if (WinLogonHelper.LogonUser("uid", "serverdomain", "pwd", 9, 0, ref admin_token) != 0) { using (wid_admin = new WindowsIdentity(admin_token)) { using (wic = wid_admin.Impersonate()) { //假定要操作的文件路径是10.0.250.11上的d:\txt.txt文件可以这样操作 FileInfo file = new FileInfo(@"\\10.0.250.11\d$\txt.txt"); //想做什么操作就可以做了 } } } } } }
模拟域帐户之后,就有了模拟用户的权限,这里千万要注意安全!