Заменить текущего пользователя Windows, запустившего EXE, другим пользователем - PullRequest
1 голос
/ 19 апреля 2011

Скажите, если я создал приложение для Windows, которое читает файлы из сетевой папки.Сетевые складки ограничивают доступ только одному пользователю "fooUser".Приложение установлено на нескольких компьютерах в сети.

Мне нужно заменить текущего пользователя на «fooUser», чтобы иметь возможность доступа к файлам в сетевой папке по коду.

Ответы [ 4 ]

7 голосов
/ 19 апреля 2011

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

  public class Impersonator : IDisposable
  {

    const int LOGON32_PROVIDER_DEFAULT = 0;
    const int LOGON32_LOGON_INTERACTIVE = 2;

    [DllImport("advapi32.dll", SetLastError = true)]
    public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    public extern static bool CloseHandle(IntPtr handle);

    private IntPtr token = IntPtr.Zero;
    private WindowsImpersonationContext impersonated;
    private readonly string _ErrMsg = "";

    public bool IsImpersonating
    {
      get { return (token != IntPtr.Zero) && (impersonated != null); }
    }

    public string ErrMsg
    {
      get { return _ErrMsg; }
    }

    [PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]
    public Impersonator(string userName, string password, string domain)
    {
      StopImpersonating();

      bool loggedOn = LogonUser(userName, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref token);
      if (!loggedOn)
      {
        _ErrMsg = new System.ComponentModel.Win32Exception().Message;
        return;
      }

      WindowsIdentity identity = new WindowsIdentity(token);
      impersonated = identity.Impersonate();
    }

    private void StopImpersonating()
    {
      if (impersonated != null)
      {
        impersonated.Undo();
        impersonated = null;
      }

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

    public void Dispose()
    {
      StopImpersonating();
    }
  }

И вы можете использовать его следующим образом;

using (Impersonator = new Impersonator(yourName,yourPassword,yourDomain))
{
 // Read files from network drives.
 // Other activities....
}

Очень важно поместить подражателя в блок 'using' или распорядиться им, когда вы закончите выполнять свои олицетворенные задачиили система будет продолжать выдавать себя за неопределенное время, что вызовет всевозможные проблемы.

0 голосов
/ 19 апреля 2011

Вы можете проверить, поможет ли вам этот вопрос LogonUser и делегирование .

0 голосов
/ 19 апреля 2011

Вы можете просто настроить подключенный диск к общей папке, которая использует учетные данные 'fooUser'.

Хотя, если у вас есть логин / пароль для пользователя, вы можете заставить свой код использовать олицетворение. Согласно моему ответу на Подражание Windows от C # :

Код олицетворения см. В следующие две статьи Code Project:

http://www.codeproject.com/KB/cs/cpimpersonation1.aspx

http://www.codeproject.com/KB/cs/zetaimpersonator.aspx

и статья Microsoft KB они на основании:

http://support.microsoft.com/default.aspx?scid=kb;en-us;Q306158

0 голосов
/ 19 апреля 2011

используйте утилиту runas: http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/runas.mspx?mfr=true

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...