Как сопоставить диск с помощью C #?

#c# #cmd #network-drive

#c# #.net

Вопрос:

Как я могу сопоставить сетевой диск с помощью C #. Я не хочу использовать net use или какой-либо сторонний API.

Слышал о UNC-путях в коде C #, но не совсем уверен, как это сделать.

Ответ №1:

Используйте WnetAddConnection функции, доступные в native mpr.dll .

Вам нужно будет написать подписи и структуры P / Invoke для вызова неуправляемой функции. Вы можете найти ресурсы на P / Invoke на pinvoke.net .

Это подпись для WNetAddConnection2 on pinvoke.net:

 [DllImport("mpr.dll")]    
public static extern int WNetAddConnection2(
   ref NETRESOURCE netResource,
   string password, 
   string username, 
   int flags);
  

Ответ №2:

Взгляните на API NetShareAdd для Windows. Конечно, вам нужно будет использовать PInvoke, чтобы получить доступ к нему.

Комментарии:

1. NetShareAdd создает общий ресурс. Вопрос заключается в том, как сопоставить существующий общий ресурс.

Ответ №3:

В .net нет стандартной функции для сопоставления сетевых дисков, но вы можете найти хорошую оболочку здесь, если вы не хотите выполнять собственные вызовы самостоятельно: http://www.codeguru.com/csharp/csharp/cs_network/windowsservices/article.php/c12357

Комментарии:

1. Ссылка мертва. Выдает 404 в codeguru.

Ответ №4:

Более простым решением является использование Process.Start()

 internal static int RunProcess(string fileName, string args, string workingDir)
{
    var startInfo = new ProcessStartInfo
    {
        FileName = fileName,
        Arguments = args,
        UseShellExecute = false,
        RedirectStandardError = true,
        RedirectStandardOutput = true,
        CreateNoWindow = true,
        WorkingDirectory = workingDir
    };

    using (var process = Process.Start(startInfo))
    {
        if (process == null)
        {
            throw new Exception($"Failed to start {startInfo.FileName}");
        }

        process.OutputDataReceived  = (s, e) => e.Data.Log();
        process.ErrorDataReceived  = (s, e) =>
            {
                if (!string.IsNullOrWhiteSpace(e.Data)) { new Exception(e.Data).Log(); }
            };

        process.BeginOutputReadLine();
        process.BeginErrorReadLine();

        process.WaitForExit();

        return process.ExitCode;
    }
}
  

После того, как у вас есть вышеуказанное, используйте ниже создание / удаление сопоставленного диска по мере необходимости.

 Converter.RunProcess("net.exe", @"use Q: \servershare", null);

Converter.RunProcess("net.exe", "use Q: /delete", null);
  

Комментарии:

1.Более простая версия — убедитесь, что вы «используете System.Диагностика;» для системы.Диагностика.Процесс: char DriveLetter = 'R'; string Path = @"\contososharethings"; Process.Start(new ProcessStartInfo(@"C:WindowsSystem32net.exe", "use " DriveLetter ": " Path));

2. Это сводит на нет всю цель программирования вместо написания сценариев.