0

Добрый день,Олицетворение чередующихся между успехом и провалом каждого запуска

Я написал программу для Windows Service, чтобы позволить себе проверить, если некоторые службы работают на удаленном компьютере. Программа запускается каждую минуту, а затем она запрашивает меня, когда статус службы изменился.

Я использовал этот код, чтобы сделать олицетворение Войти

public class Network 
{ 
    public class SoddingNetworkAuth : IDisposable 
    { 
     [DllImport("advapi32.dll", SetLastError = true)] 
     private static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr phToken); 
     [DllImport("kernel32", SetLastError = true)] 
     private static extern bool CloseHandle(IntPtr hObject); 
     private IntPtr userHandle = IntPtr.Zero; 
     private WindowsImpersonationContext impersonationContext; 
     public SoddingNetworkAuth(string user, string domain, string password) 
     { 
      if (!string.IsNullOrEmpty(user)) 
      { 
       // Call LogonUser to get a token for the user 
       bool loggedOn = LogonUser(user, domain, password, 
           9 /*(int)LogonType.LOGON32_LOGON_NEW_CREDENTIALS*/, 
           3 /*(int)LogonProvider.LOGON32_PROVIDER_WINNT50*/, 
       out userHandle); 
       if (!loggedOn) 
        throw new Win32Exception(Marshal.GetLastWin32Error()); 
       // Begin impersonating the user 
       impersonationContext = WindowsIdentity.Impersonate(userHandle); 
      } 
     } 
     public void Dispose() 
     { 
      if (userHandle != IntPtr.Zero) 
       CloseHandle(userHandle); 
      if (impersonationContext != null) 
       impersonationContext.Undo(); 
     } 
    } 
} 

И тогда я использую результаты от этого соответственно.

Проблема, с которой я сталкиваюсь, заключается в том, что при каждом втором запуске олицетворяется сбой. Так что если у меня было 5 прогонов результаты будут выглядеть следующим образом:

 
result:Running 
result:Cannot open Service Control Manager on computer [Computer Name] 
result:Running 
result:Cannot open Service Control Manager on computer [Computer Name] 
result:Running. 

Я использую логин домена учетной записи службы (который может быть изменен в случае логин, необходимый для изменения), чтобы войти в машину, которая имеет права доступа к диспетчеру управления сервисом.

using (new Impersonation.Network.SoddingNetworkAuth(userName, domain, configuration.password)) 
{ 
     var serviceController = new ServiceController(configuration.serviceName, configuration.IPaddress); 
     if (serviceController.Status == ServiceControllerStatus.Running) 
     { 
     isRunning = true; 
     } 
} 

Любые идеи относительно того, почему он не срабатывает при каждом втором запуске?

+0

Возможный дубликат [олицетворения текущего пользователя с помощью WindowsImpersonationContext для доступа к сетевому диску] (HTTP://stackoverflow.com/questions/3891260/impersonation-the-current-user-using-windowsimpersonationcontext-to-access-netwo) – MethodMan

+0

Является ли это программой, которая работает в течение всего дня или запускает новый экземпляр каждую минуту? Не могли бы вы добавить код, в котором вы создаете соединение SoddingNetworkAuth с диспетчером управления сервисами? – user1793963

+0

Это сервис Windows, который запускает его каждую минуту. –

ответ

0

Для тех, кто заинтересован, rror был усадьбой, в которой удалены данные. Ниже приведены изменения, внесенные мной в код, чтобы устранить проблему.

try 
    { 
     if (!string.IsNullOrEmpty(user)) 
     { 
     // Call LogonUser to get a token for the user 
     bool loggedOn = LogonUser(user, domain, password, 
         9 /*(int)LogonType.LOGON32_LOGON_NEW_CREDENTIALS*/, 
         3 /*(int)LogonProvider.LOGON32_PROVIDER_WINNT50*/, 
     out userHandle); 
     if (!loggedOn) 
     { 
      if (userHandle != IntPtr.Zero) 
      { 
      CloseHandle(userHandle); 
      } 
      throw new Win32Exception(Marshal.GetLastWin32Error()); 

     } 
     // Begin impersonating the user 
     impersonationContext = WindowsIdentity.Impersonate(userHandle); 
     } 
     if (userHandle != IntPtr.Zero) 
     { 
     CloseHandle(userHandle); 
     } 
     disposed = false; 
    } 
    catch 
    { 
    } 
    } 
    public void Dispose() 
    { 
    try 
    { 
     //Dispose of unmanaged resources. 
     Dispose(true); 
     // Suppress finalization. 
     GC.SuppressFinalize(this); 
    } 
    catch 
    { 
    } 

    } 
    protected virtual void Dispose(bool Disposing) 
    { 
    // Check to see if Dispose has already been called. 
    try 
    { 
     if (disposed) 
     return; 

     if (Disposing) 
     { 
     if (userHandle != IntPtr.Zero) 
     { 
      CloseHandle(userHandle); 
     } 

     if (impersonationContext != null) 
     { 
      //impersonationContext.Undo(); 
      impersonationContext.Dispose(); 
     } 
     } 
     disposed = true; 
    } 
    catch 
    { 
    } 

    } 

Усадьба, в которой я назвал данные в главном классе изменились, чтобы быть следующим:

IntPtr userHandle = IntPtr.Zero; 
    bool loggedOn = LogonUser(
userName, 
domain, 
password, 
9, 
3, 
out userHandle); 
    if (!loggedOn) 
     throw new Win32Exception(Marshal.GetLastWin32Error()); 

    WindowsImpersonationContext impersonationContext = WindowsIdentity.Impersonate(userHandle); 

      using (var serviceController = new ServiceController(serviceName, IPaddress)) 
      { 
      //code goes here 
      } 
      serviceController.Dispose(); 
      if (userHandle != IntPtr.Zero) 
      CloseHandle(userHandle); 

      if (impersonationContext != null) 
      impersonationContext.Undo();