2010-05-18 9 views
1

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 
} 
+1

Peut-être que vous pourriez poster le code pertinent? –

+0

Avez-vous vérifié la présence de virus? Il y avait un virus, commençant comme un service, nommé lsass.exe –

Répondre

2

Je ne sais pas si vous avez encore cette question, mais j'avais un problème très similaire et il a dû faire avec ne pas appeler la CloseHandle (...) au moment opportun.

Essayez de déplacer le CloseHandle (...) après le m_userWindowsID = new WindowsIdentity (token); ligne dans la méthode LogonWindowsUser.

Exemple:

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); 
     CloseHandle(token); 
    } 
} 

Hope this helps!

Chris

+1

Je supposais qu'appeler Dispose sur WindowsIdentity libérerait de la mémoire, mais il semble que vous deviez appeler CloseHandle – Doogal