получить доступ к каталогу в домене по имени пользователя и паролю

2

Я разработал приложение в С# с помощью visual studio 2015, которое копирует некоторые файлы из одного каталога (источника) в другое (назначение) в целом. Моя проблема в том, что исходный путь - это другой компьютер в домене. Я хочу иметь возможность получить доступ к каталогу и получить мои файлы, указать домен, имя пользователя и пароль для исходного компьютера. Я видел какое-то решение, но не могу получить доступ к другому компьютеру. Я использовал, чтобы получить мои файлы, используя Directory. GetDirectories (путь), и я слишком глубоко использую его сейчас и не могу изменить его, чтобы сгладить. спасибо, что помогли мне с моей проблемой. Я действительно заблокирован на несколько дней.

string[] folder1;
string[] folder2;
folder1 = Directory.GetDirectories(path);
foreach (string fld1 in folder1)
{
    folder2 = Directory.GetDirectories(fld);
    foreach(string fld2 in folder2)
    {
        for(int i = 0; i < MyList.Count(); i++)
        {
            if(fld2.Contains("nok") || fld2.Contains("Nok"))
                LNok = Directory.GetFiles(fld2, picList[i]);
            else
                Lok = Directory.GetFiles(fld2, picList[i]);
        }
    }
}
  • 0
    Пожалуйста, покажите нам свой код, что вы уже пробовали и где происходит ошибка.
  • 0
    вот как я получаю свои файлы, и это связано с этим везде, где в моем приложении, оно работало нормально, пока мне не пришлось получать файлы с компьютера в домене, заблокированном с помощью имени пользователя и пароля.
Теги:

1 ответ

1

Поскольку методы System.IO.File и System.IO.Directory не поддерживают передачу учетных данных, предпочтительным решением является выдача авторизованной учетной записи пользователя. Для этого необходимо импортировать два метода из файла advapi32.dll и kernel32.dll с помощью pInvoke:

//Impersonation functionality
[DllImport("advapi32.dll", SetLastError = true)]
private static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

//Disconnection after file operations
[DllImport("kernel32.dll")]
private static extern Boolean CloseHandle(IntPtr hObject);

Следующий код использует эти методы для создания WindowsImpersonationContext

const int LOGON_TYPE_NEW_CREDENTIALS = 9;
const int LOGON32_PROVIDER_WINNT50 = 3;

//User token that represents the authorized user account
IntPtr token = IntPtr.Zero;

bool result = LogonUser("username", "domainname", "password",  LOGON_TYPE_NEW_CREDENTIALS , LOGON32_PROVIDER_WINNT50, ref token);

if (result == true)
{
    //Use token to setup a WindowsImpersonationContext 
    using (WindowsImpersonationContext ctx = new WindowsIdentity(token).Impersonate())
    {
        //Your file operations
        string[] files = Directory.GetFiles(@"\\remotemachine\share\folder");

        //Release the context, and close user token
        ctx.Undo();
        CloseHandle(token);
    }
}

Здесь вы можете найти документацию MSDN функции LogonUser

  • 0
    привет, я попробовал ваше предложение, в режиме запуска нет исключения, но я не получаю никакого результата, файлы не загружаются. Также как каталог, в котором я смотрю, пуст, и я уверен, что это не так.
  • 0
    Я искал похожий пост на stackoverflow и нашел этот пост . Взгляните на ответ с наибольшим количеством голосов, предлагая использовать различные параметры в функции LogonUser. const int LOGON_TYPE_NEW_CREDENTIALS = 9; const int LOGON32_PROVIDER_WINNT50 = 3; bool returnValue = LogonUser(user, domain, password, LOGON_TYPE_NEW_CREDENTIALS, LOGON32_PROVIDER_WINNT50, ref token);
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню