我在使用win32的api,LogonUser方法来模拟用户登录,访问远程共享文件,由于每两秒访问4次(4个线程),从不同文件夹下copy文件,如果运行七八个小时,发现lsass进程几乎占光了cpu的资源,我感觉是这个方法运用不当造成的,但是找不到原因所在,下面是模拟用户登录的方法:
C# code
public PImpersonate(string DomainName, string strUserName, string strPassword)
{
_DomainName = DomainName;
_strUserName = strUserName;
_strPassword = strPassword;
isconnect = false;
}
public void Login()
{
if (!isconnect)
{
try
{
bool result = LogonUser(_strUserName, _DomainName,
_strPassword,
LogonSessionType.NewCredentials,
LogonProvider.Default,
out token);
if (result)
{
result = DuplicateToken(token, 2, ref dupToken);
WindowsIdentity id = new WindowsIdentity(dupToken);
impersonatedUser = id.Impersonate();
isconnect = true;
}
else
{
isconnect = false;
}
}
catch
{
isconnect = false;
}
}
} public void Logout()
{
try
{
if (impersonatedUser != null)
{
impersonatedUser.Undo();
isconnect = false;
}
// Free the token
if (token != IntPtr.Zero)
{
CloseHandle(token);
}
}
catch
{
}
} [DllImport("advapi32.dll", SetLastError = true)]
static extern bool LogonUser(
string principal,
string authority,
string password,
LogonSessionType logonType,
LogonProvider logonProvider,
out IntPtr token); [DllImport("advapi32.dll", CharSet = CharSet.Auto,
SetLastError = true)]
public extern static bool DuplicateToken(IntPtr
existingTokenHandle,
int SECURITY_IMPERSONATION_LEVEL, ref IntPtr
duplicateTokenHandle); [DllImport("kernel32.dll", SetLastError = true)]
static extern bool CloseHandle(IntPtr handle);
enum LogonSessionType : uint
{
Interactive = 2,
Network,
Batch,
Service,
NetworkCleartext = 8,
NewCredentials
}
enum LogonProvider : uint
{
Default = 0, // default for platform (use this!)
WinNT35, // sends smoke signals to authority
WinNT40, // uses NTLM
WinNT50 // negotiates Kerb or NTLM
}访问共享的代码是:
C# code
while (true)
{
//与共享建立连接
PImpersonate connectremote = new PImpersonate(remoteip, remoteuser, remotepassword);
connectremote.Login(); FileInfo[] filelist = null;
try
{
filelist = new DirectoryInfo("\\\\" + remoteip + "\\" + sharefolder).GetFiles("*." + sourcefileformat); foreach (FileInfo file in filelist)
{
DateTime dtnow = DateTime.Now;
TimeSpan t = dtnow - file.LastWriteTime;
if (t.TotalSeconds > 2)
{
try
{
file.CopyTo(localpath + "\\" + file.Name, true);
}
catch (Exception ex)
{
Log.writelog("##copy share file exception.\r\n\t"+ex.ToString()+"File is from " + "\\\\" + remoteip + "\\" + sharefolder + "\\" + file.Name + , logpath);
Thread.Sleep(100);
continue;
}
Thread.Sleep(10);
try
{
file.Delete();
Log.writelog("Copy finish.File frome " + "\\\\" + remoteip + "\\" + sharefolder + "\\" + file.Name + ",and save to " + localpath + "\\" + file.Name, logpath);
}
catch(Exception ex)
{
Thread.Sleep(100);
File.Delete(localpath + "\\" + file.Name);
Log.writelog("##Delete share file exception.\r\n\t" + ex.ToString() + "File is from " + "\\\\" + remoteip + "\\" + sharefolder + "\\" + file.Name,logpath);
continue;
}
}
Thread.Sleep(200);
}
}
catch(Exception ex)
{
connectremote.Logout();
Log.writelog("## Here..copy....file visit exception...***"+ex.ToString(), logpath);
Thread.Sleep(20000);
continue;
} }
//成功,断开连接
connectremote.Logout();
Thread.Sleep(2000);
#endregion
}
Thank you in advance.
C# code
public PImpersonate(string DomainName, string strUserName, string strPassword)
{
_DomainName = DomainName;
_strUserName = strUserName;
_strPassword = strPassword;
isconnect = false;
}
public void Login()
{
if (!isconnect)
{
try
{
bool result = LogonUser(_strUserName, _DomainName,
_strPassword,
LogonSessionType.NewCredentials,
LogonProvider.Default,
out token);
if (result)
{
result = DuplicateToken(token, 2, ref dupToken);
WindowsIdentity id = new WindowsIdentity(dupToken);
impersonatedUser = id.Impersonate();
isconnect = true;
}
else
{
isconnect = false;
}
}
catch
{
isconnect = false;
}
}
} public void Logout()
{
try
{
if (impersonatedUser != null)
{
impersonatedUser.Undo();
isconnect = false;
}
// Free the token
if (token != IntPtr.Zero)
{
CloseHandle(token);
}
}
catch
{
}
} [DllImport("advapi32.dll", SetLastError = true)]
static extern bool LogonUser(
string principal,
string authority,
string password,
LogonSessionType logonType,
LogonProvider logonProvider,
out IntPtr token); [DllImport("advapi32.dll", CharSet = CharSet.Auto,
SetLastError = true)]
public extern static bool DuplicateToken(IntPtr
existingTokenHandle,
int SECURITY_IMPERSONATION_LEVEL, ref IntPtr
duplicateTokenHandle); [DllImport("kernel32.dll", SetLastError = true)]
static extern bool CloseHandle(IntPtr handle);
enum LogonSessionType : uint
{
Interactive = 2,
Network,
Batch,
Service,
NetworkCleartext = 8,
NewCredentials
}
enum LogonProvider : uint
{
Default = 0, // default for platform (use this!)
WinNT35, // sends smoke signals to authority
WinNT40, // uses NTLM
WinNT50 // negotiates Kerb or NTLM
}访问共享的代码是:
C# code
while (true)
{
//与共享建立连接
PImpersonate connectremote = new PImpersonate(remoteip, remoteuser, remotepassword);
connectremote.Login(); FileInfo[] filelist = null;
try
{
filelist = new DirectoryInfo("\\\\" + remoteip + "\\" + sharefolder).GetFiles("*." + sourcefileformat); foreach (FileInfo file in filelist)
{
DateTime dtnow = DateTime.Now;
TimeSpan t = dtnow - file.LastWriteTime;
if (t.TotalSeconds > 2)
{
try
{
file.CopyTo(localpath + "\\" + file.Name, true);
}
catch (Exception ex)
{
Log.writelog("##copy share file exception.\r\n\t"+ex.ToString()+"File is from " + "\\\\" + remoteip + "\\" + sharefolder + "\\" + file.Name + , logpath);
Thread.Sleep(100);
continue;
}
Thread.Sleep(10);
try
{
file.Delete();
Log.writelog("Copy finish.File frome " + "\\\\" + remoteip + "\\" + sharefolder + "\\" + file.Name + ",and save to " + localpath + "\\" + file.Name, logpath);
}
catch(Exception ex)
{
Thread.Sleep(100);
File.Delete(localpath + "\\" + file.Name);
Log.writelog("##Delete share file exception.\r\n\t" + ex.ToString() + "File is from " + "\\\\" + remoteip + "\\" + sharefolder + "\\" + file.Name,logpath);
continue;
}
}
Thread.Sleep(200);
}
}
catch(Exception ex)
{
connectremote.Logout();
Log.writelog("## Here..copy....file visit exception...***"+ex.ToString(), logpath);
Thread.Sleep(20000);
continue;
} }
//成功,断开连接
connectremote.Logout();
Thread.Sleep(2000);
#endregion
}
Thank you in advance.
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货