Как мне предоставить учетные данные, чтобы я мог подключиться к сетевому диску в .NET?
Im пытается получить файлы с сетевого диска и вам нужно предоставить учетные данные пользователя для доступа к диску.
Как мне предоставить учетные данные, чтобы я мог подключиться к сетевому диску в .NET?
Im пытается получить файлы с сетевого диска и вам нужно предоставить учетные данные пользователя для доступа к диску.
Лучший способ сделать это - 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
);
Очень элегантное решение, вдохновленное этим. Этот использует только библиотеку .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");
Вы можете использовать класс WindowsIdentity (с токеном входа), чтобы выдавать себя за чтение и запись файлов.
var windowsIdentity = new WindowsIdentity(logonToken);
using (var impersonationContext = windowsIdentity.Impersonate()) {
// Connect, read, write
}
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);
}
вы можете использовать system.diagnostocs.process для вызова "net use... с идентификатором пользователя и паролем" или с командной оболочкой, которая их принимает.
Я действительно не знаю скрытый процесс, но я использую веб-запрос, таким образом я могу передать учетные данные, и он отлично сработал для меня.
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();
}
Вы можете использовать класс WebClient для подключения к сетевому драйверу с использованием учетных данных. Включите следующее пространство имен:
using System.Net;
WebClient request = new WebClient();
request.Credentials = new NetworkCredential("domain\username", "password");
string[] theFolders = Directory.GetDirectories(@"\\computer\share");