Mit RDP 7.0 hat Microsoft ja beschlossen gaaaanz schlau zu sein und im RDP-File Parameter DRIVESTOREDIRECT nicht mehr nur einfach die Laufwerksbuchstaben die man gerne in die Session mappen würde zuzulassen sondern da muss man echt das eintragen was der Explodierer zum Zeitpunkt des Verbindungsaufbaus (wie das Teil nachher heißt ist vollkommen schnurz….) anzeigt, also z.B. „CD-Laufwerk (D:)“ – da das naturgemäß ein brutal bewegliches Ziel ist (Sprache, Typen, Volumenamen, Laufwerksbuchstabe vorne/hinten, etc.) kann man das nicht wirklich hardcoden und ist damit aufgeschmissen…..gäbe es in der SHELL32.DLL nicht die Funktion SHGetFileInfo() die uns genau das liefert was wir wollen (DisplayName in der SHFILEINFO Struktur die da befüllt wird), hier ein Beispielprogramm dass alle Laufwerke auflistet:


using System;
using System.Runtime.InteropServices;

namespace GetVolumeLabel
{
   [StructLayout(LayoutKind.Sequential)]
   public struct SHFILEINFO
   {
      public IntPtr Icon;
      public int IconIndex;
      public uint Attributes;
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
      public string DisplayName;
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
      public string TypeName;
   };

   class Program
   {
      public const uint SHGFI_DISPLAYNAME = 0x200;

      [DllImport("shell32.dll")]
      public static extern IntPtr SHGetFileInfo(string Path, uint FileAttributes, ref SHFILEINFO Info, uint Size, uint Flags);

      static void Main(string[] args)
      {
         SHFILEINFO oInfo;
         IntPtr oRes;

         for (char cDrive = 'A'; cDrive <= 'Z'; cDrive++ )
         {
            oInfo =  new SHFILEINFO();
            oRes = SHGetFileInfo(cDrive + ":\\", 0, ref oInfo, (uint)Marshal.SizeOf(oInfo), SHGFI_DISPLAYNAME);
            Console.WriteLine(cDrive + ":\\ = '" + oInfo.DisplayName + "'");
         }

      }
   }
}