C# 使用Impersonator创建文件时连接到网络驱动器一次
我必须使用指定的用户在网络驱动器中创建许多文件 我曾经连接不同的用户 我使用模拟类:C# 使用Impersonator创建文件时连接到网络驱动器一次,c#,impersonation,network-drive,C#,Impersonation,Network Drive,我必须使用指定的用户在网络驱动器中创建许多文件 我曾经连接不同的用户 我使用模拟类: public class Impersonator : IDisposable { const int LOGON32_PROVIDER_DEFAULT = 0; const int LOGON32_LOGON_INTERACTIVE = 2; [DllImport("advapi32.dll", SetLastError = true)] public static ext
public class Impersonator : IDisposable
{
const int LOGON32_PROVIDER_DEFAULT = 0;
const int LOGON32_LOGON_INTERACTIVE = 2;
[DllImport("advapi32.dll", SetLastError = true)]
public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public extern static bool CloseHandle(IntPtr handle);
private IntPtr token = IntPtr.Zero;
private WindowsImpersonationContext impersonated;
private readonly string _ErrMsg = "";
public bool IsImpersonating
{
get { return (token != IntPtr.Zero) && (impersonated != null); }
}
public string ErrMsg
{
get { return _ErrMsg; }
}
[PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]
public Impersonator(string userName, string password, string domain)
{
StopImpersonating();
bool loggedOn = LogonUser(userName, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref token);
if (!loggedOn)
{
_ErrMsg = new System.ComponentModel.Win32Exception().Message;
return;
}
WindowsIdentity identity = new WindowsIdentity(token);
impersonated = identity.Impersonate();
}
private void StopImpersonating()
{
if (impersonated != null)
{
impersonated.Undo();
impersonated = null;
}
if (token != IntPtr.Zero)
{
CloseHandle(token);
token = IntPtr.Zero;
}
}
public void Dispose()
{
StopImpersonating();
}
}
以及守则:
using (Impersonator impersonator = new Impersonator("UserName", "UserPwd", "UserDomaine"))
{
if (!Directory.Exists("Z:\\")) // check if Network drive exist
{
NetworkDrive drive = new NetworkDrive
{
ShareName = @"\\IP\Partage",
LocalDrive = "Z",
Force = true
};
drive.MapDrive(@"UserDomaine\UserName", "UserPwd");
}
File.Create(@"Z:\Log\FileName.txt");
}
但是在本例中,我发现每次我必须创建或更新文件时,代码都会映射驱动器!!我对这个函数做了很多工作
有一个解决方案,不是每次都映射它
在打开应用程序时,我试图将驱动程序映射到该用户,但遇到了相同的问题。尝试不要使用Using block。将模拟程序声明为全局静态变量。我认为您不需要映射驱动器。模拟后,您可以直接使用网络驱动器创建文件,它将以模拟用户的身份创建文件
using (Impersonator impersonator = new Impersonator("UserName", "UserPwd", "UserDomaine"))
{
File.Create(@"\\IP\Partage\Log\FileName.txt");
}
如果不使用,将不会使用服务器上的newuserFrom,您可以尝试从windows资源管理器中访问路径,作为用户之一登录吗?我在本地it工作中测试了这一点(我必须在项目中实现这一点,并将其发送到服务器生产部门,然后告诉您结果