Подтвердить что ты не робот

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

Как мне предоставить учетные данные, чтобы я мог подключиться к сетевому диску в .NET?

Im пытается получить файлы с сетевого диска и вам нужно предоставить учетные данные пользователя для доступа к диску.

4b9b3361

Ответ 1

Лучший способ сделать это - p/invoke WNetUseConnection.

[StructLayout(LayoutKind.Sequential)] 
private class NETRESOURCE
{ 
        public int dwScope = 0;
        public int dwType = 0;
        public int dwDisplayType = 0;
        public int dwUsage = 0;
        public string lpLocalName = "";
        public string lpRemoteName = "";
        public string lpComment = "";
        public string lpProvider = "";
}


[DllImport("Mpr.dll")] 
private static extern int WNetUseConnection(
            IntPtr hwndOwner,
            NETRESOURCE lpNetResource,
            string lpPassword,
            string lpUserID,
            int dwFlags,
            string lpAccessName,
            string lpBufferSize,
            string lpResult
        );

Пример кода здесь.

Ответ 2

Очень элегантное решение, вдохновленное этим. Этот использует только библиотеку .Net и не требует использования командной строки или Win32 API.

Код для готовой ссылки:

NetworkCredential theNetworkCredential = new NetworkCredential(@"domain\username", "password");
CredentialCache theNetCache = new CredentialCache();
theNetCache.Add(new Uri(@"\\computer"), "Basic", theNetworkCredential);
string[] theFolders = Directory.GetDirectories(@"\\computer\share");

Ответ 3

Вы можете использовать класс WindowsIdentityтокеном входа), чтобы выдавать себя за чтение и запись файлов.

var windowsIdentity = new WindowsIdentity(logonToken);
using (var impersonationContext = windowsIdentity.Impersonate()) {
    // Connect, read, write
}

Ответ 4

var fileName = "Mylogs.log";
var local = Path.Combine(@"C:\TempLogs", fileName);
var remote = Path.Combine(@"\\servername\c$\Windows\Temp\", fileName);

WebClient request = new WebClient();
request.Credentials = new NetworkCredential(@"username", "password");

if (File.Exists(local))
{
    File.Delete(local);

    File.Copy(remote, local, true);
}
else
{
    File.Copy(remote, local, true);
}

Ответ 5

вы можете использовать system.diagnostocs.process для вызова "net use... с идентификатором пользователя и паролем" или с командной оболочкой, которая их принимает.

Ответ 6

Я действительно не знаю скрытый процесс, но я использую веб-запрос, таким образом я могу передать учетные данные, и он отлично сработал для меня.

var ftpDownloadFile = WebRequest.Create("filePath");
ftpDownloadFile.Method = WebRequestMethods.Ftp.DownloadFile;
ftpDownloadFile.Credentials = new NetworkCredential("user", "pass");
using (var reader = (FtpWebResponse)ftpDownloadFile.GetResponse())
using (var responseStream = reader.GetResponseStream())
{
var writeStream = new FileStream(Path.Combine(LocalStorage), FileMode.Create);
const int length = 2048;
var buffer = new Byte[length];
if (responseStream != null)
{
var bytesRead = responseStream.Read(buffer, 0, length);
while (bytesRead > 0)
{
writeStream.Write(buffer, 0, bytesRead);
bytesRead = responseStream.Read(buffer, 0, length);
}
}
reader.Close();
writeStream.Close();
}

Ответ 7

Вы можете использовать класс WebClient для подключения к сетевому драйверу с использованием учетных данных. Включите следующее пространство имен:

using System.Net;

WebClient request = new WebClient();
request.Credentials = new NetworkCredential("domain\username", "password");
string[] theFolders = Directory.GetDirectories(@"\\computer\share");