Как я определяю фактический путь сетевого диска?

Как я определяю фактический путь сетевого диска?

Таким образом, если у меня есть сетевой диск на машине, названной "Z", как может, я использующий.NET определяю машину и путь для отображенной папки?

Код может предположить, что работает на машине с сетевым диском.

Я посмотрел на Путь, Каталог, объекты FileInfo, но, может казаться, ничего не нахожу.

Я также искал существующие вопросы, но не мог найти то, что я ищу.

47
задан Eric Schneider 14 January 2010 в 19:46
поделиться

6 ответов

Вот некоторые образцы кода:

Все магии происходит из функции Windows:

    [DllImport("mpr.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    public static extern int WNetGetConnection(
        [MarshalAs(UnmanagedType.LPTStr)] string localName, 
        [MarshalAs(UnmanagedType.LPTStr)] StringBuilder remoteName, 
        ref int length);

Пример вызова:

var sb = new StringBuilder(512);
var size = sb.Capacity;
var error = Mpr.WNetGetConnection("Z:", sb, ref size);
if (error != 0)
    throw new Win32Exception(error, "WNetGetConnection failed");
 var networkpath = sb.ToString();
24
ответ дан 26 November 2019 в 19:17
поделиться

Насколько Windows заботится, то то, что нужно, - это призыв к wnetGetConnection . Я не знаю о фронте для этого в .NET, так что вам, возможно, придется называть его через P / Invoke (к счастью, у него есть только один параметр, код P / Invoke не слишком ужасен).

0
ответ дан 26 November 2019 в 19:17
поделиться

QuerydosDevice Перевод писем привода в путь, к которому он расширяется.

Обратите внимание, что это переводит все буквы привода, а не только те, которые отображаются на сетевые соединения. Вам нужно уже знать, какие сетевые пути или анализа вывода, чтобы увидеть, какие сети.

Вот подпись Vb

Declare Function QueryDosDevice Lib "kernel32" Alias "QueryDosDeviceA" (
       ByVal lpDeviceName    As String, 
       ByVal lpTargetPath As String, 
       ByVal ucchMax As Integer) As Integer 

и C # One

[DllImport("kernel32.dll")]
static extern uint QueryDosDevice(string lpDeviceName, IntPtr lpTargetPath, uint ucchMax);
4
ответ дан 26 November 2019 в 19:17
поделиться

Кажется, это нужен P / Invoke: Преобразование сопоставленной буквы диска на сетевой путь с использованием C #

Этот парень построил управляемый класс, чтобы справиться с ним: Сетевой диск C # MAP (API)

2
ответ дан 26 November 2019 в 19:17
поделиться

Вы Также можно использовать WMI Win32_LogialDisk, чтобы получить все необходимую информацию. Используйте ProvielyName из класса, чтобы получить путь UNC.

2
ответ дан 26 November 2019 в 19:17
поделиться

Вы можете использовать WMI, чтобы допросить коллекцию Win32_LogiClive на вашем компьютере. Вот пример того, как сделать это со сценарием . Изменение этого в C # довольно хорошо объяснено в других местах.

Слегка модифицированный код VB.Net из статьи:

Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim strComputer = "."

        Dim objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

        Dim colDrives = objWMIService.ExecQuery("Select * From Win32_LogicalDisk Where DriveType = 4")

        For Each objDrive In colDrives
            Debug.WriteLine("Drive letter: " & objDrive.DeviceID)
            Debug.WriteLine("Network path: " & objDrive.ProviderName)
        Next
    End Sub

End Class
4
ответ дан 26 November 2019 в 19:17
поделиться