2014-02-25 17 views
5

Grundlagen: C# WinForms Desktop-Anwendung für Dot Net 4.Wie kann ich den "Anzeigenamen" für eine zugeordnete Netzwerkfreigabe lesen?

Ich zähle alle Laufwerke auf einem System mit System.IO.DriveInfo. Das funktioniert ganz gut und kann mir auch sagen, um welche Art von Laufwerk es sich handelt (Festnetz/Netzwerk/CD-ROM, etc). Es kann mir auch das VolumeLabel geben - das funktioniert wie gewünscht auf lokalen Laufwerken, aber für gemappte Netzwerklaufwerke gibt es das VolumeLabel des logischen Laufwerks, wie es auf dem Host-Computer definiert ist. In Windows Explorer können Sie jedem zugeordneten Laufwerk einen Anzeigenamen geben. Gibt es eine Möglichkeit, diesen Anzeigenamen programmgesteuert abzurufen? Dieser Name ist offensichtlich derjenige, der der Person vertraut ist, die den Computer benutzt.

Zum Beispiel können in der folgenden Abbildung sowohl "Critical" als auch "NonCritical" unterschiedliche Freigaben auf demselben logischen Datenträger mit dem Datenträgernamen "Data" auf dem Hostcomputer sein. Das Abfragen von WMI für VolumeName gibt "Data" zurück und die anderen Abfragen geben nur den Laufwerksbuchstaben oder sonst nichts zurück.

Example

Ich habe am Info verfügbar über WMI sah (siehe: How to programmatically discover mapped network drives on system and their server names?), aber es scheint nicht, eine Eigenschaft zu sein, die diesen freundlichen Namen zurückgibt. Ich habe bei Beschriftung, Beschreibung, Systemname sah, und Volumename - wie folgt aus:

private void NetworkDrives() 
{ 
    try 
    { 
     var searcher = new ManagementObjectSearcher(
      "root\\CIMV2", 
      "SELECT * FROM Win32_MappedLogicalDisk"); 

     TreeNode share; 
     TreeNode property; 

     foreach (ManagementObject queryObj in searcher.Get()) 
     { 
      share = new TreeNode("Name:" + queryObj["Name"]);      
      share.Nodes.Add("Caption: " + queryObj["Caption"]); 
      share.Nodes.Add("Description: " + queryObj["Description"]); 
      share.Nodes.Add("SystemName: " + queryObj["SystemName"]); 
      share.Nodes.Add("VolumeName: " + queryObj["VolumeName"]); 
      share.Nodes.Add("DeviceID: " + queryObj["DeviceID"]); 
      treeView1.Nodes.Add(share); 
     } 
    } 
    catch (ManagementException ex) 
    { 
     MessageBox.Show("An error occurred while querying for WMI data: " + ex.Message); 
    } 
} 

Vielen Dank im Voraus.

+0

Ich bin nicht in der Lage ein zugeordnetes Laufwerk hinzuzufügen ich dies aus zu testen, aber haben Sie diese Diskussion gesehen [Thema] (http://social.msdn.microsoft.com/Forums/en-US/14846a85- e188-438e-9439-93ecccdb85f79/friendly-drive-names? forum = Vsexpressvb) (und der Vorschlag, 'Win32_DiskDrive' abzufragen)? –

+0

@ledbutter: Ja, ich habe. Wie sie sagen, geben Caption und Beschreibung nicht die Informationen, die wir wollen. Ich habe noch keine WMI-Eigenschaft gefunden, die diese spezifische Information zurückgibt. Sehen Sie sich meinen Kommentar zu JPBlanc's Antwort an, wo dies in der Registrierung steht. – Nicolas

Antwort

2

Mit Win32_LogicalDisk was du hast:

DeviceID  : P: 
DriveType : 4 
ProviderName : \\localhost\download\Chic 
FreeSpace : 26406707200 
Size   : 500000878592 
VolumeName : 

Für DriveType 4, finden Sie das Volume im letzten Teil des UNC-Namen finden. Sie müssen nur einen regulären Ausdruck verwenden, um es zu bekommen.


Nach Ihrem Kommentar bearbeitet.

Mit Powershell (nicht weit von C#) kann geschrieben werden:

cd HKCU: 
Get-ChildItem HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2 | where {$_.name -like '*##localhost#download#Chic'} | % {(Get-ItemProperty -LiteralPath $_.name -Name _LabelFromReg)._LabelFromReg} 
+0

Regex über die Spitze. Lies rückwärts, bis du den ersten Pfad gefunden hast. Split auf Pfad sep würde funktionieren. –

+0

@JPBlanc: Ok, ProviderName ist auch auf Win32_MappedLogicalDisk verfügbar. Es gibt den vollen Aktienpfad zurück, was ein guter Anfang ist, obwohl es nicht genau das ist, was ich mir erhofft habe. Die Standardbezeichnung für ein zugeordnetes Netzlaufwerk basiert auf dem ProviderName, den Sie beschreiben. Die Sache ist, dass Sie dieses Label auf alles, was Sie wollen, bearbeiten können - z.\\ Srv \ Share1 wird als "Share1 auf Srv (M :)" standardmäßig zugeordnet, Sie können es jedoch im Explorer in "Server Stuff (M :)" umbenennen. ProviderName gibt weiterhin \\ Srv \ Share1 zurück. – Nicolas

+0

Die richtigen Werte befinden sich in der Registrierung im _LabelFromReg-Wert im Schlüssel \ HKEY_USERS \ \ Software \ Microsoft \ Windows \ AktuelleVersion \ Explorer \ MountPoints2 \ ## Srv # Share1. Es existiert nur, wenn Sie eine Freigabe neu gekennzeichnet haben. Ich werde nicht durch alle Reifen springen, um diesen Wert zu erhalten! – Nicolas

1

Die korrekten Werte werden in der Registry im Wert gespeichert _LabelFromReg des Schlüssels HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints‌​2\##ServerName#ShareName. Dieser Wert gilt nur für eine Freigabe, wenn Sie diese Freigabe neu gekennzeichnet haben.

EDIT: Hier ist ein Arbeitsbeispiel, wenn auch ohne ordnungsgemäße Fehlerprüfung. Danke JPBlanc für die Registry Shortcut HKEY_CURRENT_USER\etc anstelle von HKEY_USERS\<SID>\etc zu verwenden.

private string GetDriveLabel(DriveInfo drv) 
{ 
    string drvName; 
    string drvLabel; 
    string pvdr = ""; 

    //Start off with just the drive letter 
    drvName = "(" + drv.Name.Substring(0,2) + ")"; 

    //Use the volume label if it is not a network drive 
    if (drv.DriveType != DriveType.Network) 
    { 
     drvLabel = drv.VolumeLabel; 
     return drvLabel + " " + drvName; 
    } 

    //Try to get the network share name    
    try 
    { 
     var searcher = new ManagementObjectSearcher(
      "root\\CIMV2", 
      "SELECT * FROM Win32_MappedLogicalDisk WHERE Name=\"" + drv.Name.Substring(0,2) + "\""); 

     foreach (ManagementObject queryObj in searcher.Get()) 
     { 
      pvdr = @queryObj["ProviderName"].ToString(); 
     } 
    } 
    catch (ManagementException ex) 
    { 
     pvdr = ""; 
    } 

    //Try to get custom label from registry 
    if (pvdr != "") 
    { 
     pvdr = pvdr.Replace(@"\", "#"); 
     drvLabel = (string)Registry.GetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\" + pvdr, "_LabelFromReg", ""); 
     if (string.IsNullOrEmpty(drvLabel)) 
     { 
      //If we didn't get the label from the registry, then extract the share name from the provider 
      drvLabel = pvdr.Substring(pvdr.LastIndexOf("#") + 1); 
     } 
     return drvLabel + " " + drvName; 
    } 
    else 
    { 
     //No point in trying the registry if we don't have a provider name 
     return drvName; 
    } 
}