J'ai créé une classe d'emprunt d'identité qui inclut WindowsIdentity et WindowsImpersonationContext et j'ai ajouté l'emprunt d'identité dans mon application d'authentification après que le service est en cours d'exécution pendant un certain temps. Le processus lsass.exe est consommer beaucoup de mémoire et de CPU Pourriez-vous s'il vous plaît me conseiller comment résoudre ce problème?lsass.exe prend beaucoup de mémoire et de CPU
public class Impersonation : IDisposable
{
#region external
// Declare signatures for Win32 LogonUser and CloseHandle APIs
[DllImport("advapi32.dll", SetLastError = true)]
static extern bool LogonUser(
string principal,
string authority,
string password,
LogonSessionType logonType,
LogonProvider logonProvider,
out IntPtr token);
[DllImport("kernel32.dll", SetLastError = true)]
public 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
}
#endregion
#region variables
private WindowsIdentity m_userWindowsID;
private WindowsImpersonationContext m_userImpersonationContext;
#endregion
public void LogonWindowsUser(string domain, string userLogin, string password)
{
IntPtr token;
// Create a token for DomainName\Bob
// Note: Credentials should be encrypted in configuration file
bool result = LogonUser(userLogin, domain, password,
LogonSessionType.NewCredentials,
LogonProvider.Default,
out token);
if (result)
{
m_userWindowsID = new WindowsIdentity(token);
}
}
public void ImpersonateUser()
{
if (m_userWindowsID == null)
{
throw new Exception("User is not loged on");
}
m_userImpersonationContext = m_userWindowsID.Impersonate();
}
#region IDisposable Members
public void Dispose()
{
if (m_userImpersonationContext != null)
{
m_userImpersonationContext.Undo();
m_userImpersonationContext.Dispose();
}
if (m_userWindowsID != null)
{
CloseHandle(m_userWindowsID.Token);
m_userWindowsID.Dispose();
//m_userWindowsID.Token = IntPtr.Zero;
}
}
#endregion
}
Peut-être que vous pourriez poster le code pertinent? –
Avez-vous vérifié la présence de virus? Il y avait un virus, commençant comme un service, nommé lsass.exe –