2015-09-09 2 views
2

Проблемы:олицетворения для локального компьютера Сменив, когда она выйдет из строя

У меня есть служба Windows, которая использует олицетворения, чтобы проверить состояние службы на отдельном сервере, однако это было отмечено в ходе тестирования, что, когда пользователь ввел локальную машину адреса и недопустимой учетной записи локального компьютера, проверка будет продолжена, чтобы открыть диспетчер управления службами и получить статус успешно. Мы стремимся к тому, чтобы он работал только с действительной учетной записью локального компьютера.

Кодекс: Олицетворение пространства имен (содержит метод (SoddingNetworkAuth) используется для настройки олицетворения:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Web; 
using System.ComponentModel; 
using System.Runtime.InteropServices; 
using System.Security.Principal; 

namespace Impersonation 
{ 
    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(); 
     } 
    } 
    } 
} 

Консольный приложение, которое я написал для теста:

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.ServiceProcess; 


namespace NetworkAuthIssue 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string result; 
      try 
      { 
       using (new Impersonation.Network.SoddingNetworkAuth("Invalid User", "localhost", "InvalidPassword")) 
       { 
        var serviceController = new ServiceController("Power", "localhost"); 
        if (serviceController.Status == ServiceControllerStatus.Running) 
        { 
         result = "Authenticated, service running"; 
        } 
        else 
        { 
         result = "Authenticated, service not running"; 
        } 
       } 
      } 
      catch (Exception e) 
      { 
       result = "Authentication Failed"; 
      } 
      Console.WriteLine(result); 
      Console.Read(); 
     } 
    } 
} 

Я работающий под управлением Windows 8.1

ответ

1

Это потому, что вы используете LOGON32_LOGON_NEW_CREDENTIALS.

Из https://msdn.microsoft.com/en-us/library/windows/desktop/aa378184%28v=vs.85%29.aspx (курсив мой):

Этот тип входа позволяет вызывающему клонировать свой текущий маркер и указать новые учетные данные для исходящих соединений. Новый сеанс входа в систему имеет тот же локальный идентификатор, но использует другие учетные данные для других сетевых подключений.

Важное значение имеет часть «исходящих соединений». Это означает, что для локальных подключений предоставленные учетные данные вообще не используются. Текущая идентификация используется для локальных соединений.

0

Я не могу проверить все прямо сейчас, но у меня были похожие проблемы, подобные вам, и это было вызвано выбранными значениями LogonType/LogonProvider i n Метод входа в систему. Вы должны попробовать их в консольном приложении и использовать комбинацию, которая работает для вашего сценария.

Смотрите также документацию MSDN для этого метода: https://msdn.microsoft.com/en-us/library/windows/desktop/aa378184(v=vs.85).aspx