Подключитесь к сетевому диску с именем пользователя и паролем - PullRequest
20 голосов
/ 13 сентября 2010

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

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

Ответы [ 7 ]

13 голосов
/ 13 сентября 2010

Лучший способ сделать это - вызвать / вызвать 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
        );

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

11 голосов
/ 13 марта 2014

Очень элегантное решение, вдохновленное этим . Этот использует только библиотеку .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");
5 голосов
/ 13 сентября 2010

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

var windowsIdentity = new WindowsIdentity(logonToken);
using (var impersonationContext = windowsIdentity.Impersonate()) {
    // Connect, read, write
}
1 голос
/ 10 апреля 2019
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);
}
0 голосов
/ 28 февраля 2019

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

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();
}
0 голосов
/ 26 мая 2017

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

using System.Net;

WebClient request = new WebClient();
request.Credentials = new NetworkCredential("domain\username", "password");
string[] theFolders = Directory.GetDirectories(@"\\computer\share");
0 голосов
/ 13 сентября 2010

вы можете использовать system.diagnostocs.process, чтобы вызвать 'net use .... with userid and password' или командную оболочку, которая их принимает.

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