如何更改 Windows 中卷的 'friendly label'?

How to change the 'friendly label' of a volume in Windows?

我想更改这个标签:

上图是我手动改的,没有任何权限

我按照 this 线程中的说明尝试了以下操作,但它给出了 System.UnauthorizedAccessException

public void setVolumeLabel(String oldName, string newLabel){
        DriveInfo[] allDrives = DriveInfo.GetDrives();
        foreach (DriveInfo d in allDrives){
            if (d.IsReady && d.Name.Equals(oldName)){
            d.VolumeLabel = newLabel;
        }
}

所以 VolumeLabel 属性 不是我要找的。 然后我读了 this post,但由于某种原因无法导入 Shell32.dll,它说 Axlmp.exe 找不到。

也尝试过 SetVolumeName()。它 returns 非零数字,但不会更改 VolumeName。

[DllImport("kernel32.dll", SetLastError=true)]  
public static  extern bool SetVolumeLabel(String letter, String label);

[DllImport("kernel32.dll")]
public static extern uint GetLastError();

当您(大概)以管理员权限登录时,您可以在资源管理器中对其进行编辑。但是您的 C# 软件不会 运行 作为管理员,除非您通过以下方法之一特别说明:

1) 运行宁 VS 作为管理员

2) 运行 以管理员身份在资源管理器中使用您的应用程序

3) 通过其清单

将您的应用程序配置为 运行 作为管理员

DriveInfo.VolumeLabel property 的文档非常清楚地指出,UnauthorizedAccessException 可能会因以下原因之一而抛出:

  • The volume label is being set on a network or CD-ROM drive.
  • Access to the drive information is denied.

第二个是一个很好的假设;就是那个 。但是,您已经表明情况并非如此。

考虑到您在问题的评论中指出驱动器 J: 实际上是一个网络驱动器,所以剩下第一个是有道理的。您不能使用此机制更改网络驱动器的标签。

为此,您需要使用 COM 接口。您将查询 shell 以获得该对象的 Folder2 object representing the network drive you wish to manipulate. Then, you will use this object's Self property to retrieve the folder's corresponding FolderItem object. Finally, you can directly set the Name property

Here is the solution in C++, and you already found the solution in C# and VB 6。但是,您声称您无法按照 Syberdoor 的建议添加对 "Microsoft Shell Controls and Automation" 库的引用。我不确定为什么不。您收到的错误消息毫无意义。 AxImp.exe 是标准 .NET Framework 安装的一部分。你可能做错了。尝试:

  1. 在解决方案资源管理器中右键单击项目
  2. Select "Add Reference"
  3. 在 "Add Reference" 对话框中,切换到 "COM" 选项卡
  4. 勾选"Microsoft Shell Controls and Automation"

我想如果你不知何故没有安装 Windows SDK,你可能会丢失 AxImp.exe,并且 Visual Studio 可能无法创建允许你的存根程序集使用类型库。我无法想象那怎么可能发生。如果你安装了 Visual Studio,你应该已经安装了 SDK。