0

我想更改此标签:

那

在上图中,我在没有任何权限的情况下手动更改了它。

我按照线程中的说明尝试了以下操作,但它给出了 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 属性不是我想要的。然后我读了这篇文章,但由于某种原因无法导入Shell32.dll,它说找不到Axlmp.exe。

也尝试过SetVolumeName()。它返回非零数字,但不改变 de VolumeName。

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

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

2 回答 2

1

当您(可能)以管理员权限登录时,您可以在资源管理器中进行编辑。但是,除非您通过以下方法之一明确说明,否则您的 C# 软件不会以管理员身份运行:

1)以管理员身份运行VS

2) 以管理员身份在 Explorer 中运行您的应用程序

3) 将您的应用程序配置为通过其清单以管理员身份运行

于 2016-12-21T15:29:23.550 回答
0

由于该DriveInfo.VolumeLabel属性的文档非常清楚地说明,UnauthorizedAccessException可以由于以下原因之一抛出 an:

  • 正在网络或 CD-ROM 驱动器上设置卷标。
  • 拒绝访问驱动器信息。

第二个是一个很好的假设。这是威尔摩勋爵在他的回答中所做的。但是,您已经表明情况并非如此。

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

为此,您需要使用 COM 接口。您将查询 shell 以获取代表您希望操作的网络驱动器的Folder2对象。然后,您将使用此对象的Self属性来检索文件夹的对应FolderItem对象。最后,您可以直接设置该对象的Name属性

这是 C++ 中的解决方案您已经在 C# 和 VB 6 中找到了解决方案。但是,您声称无法按照 Syberdoor 的建议添加对“Microsoft Shell 控件和自动化”库的引用。我不知道为什么不。您收到的错误消息毫无意义。AxImp.exe 是标准 .NET Framework 安装的一部分。你可能做错了。尝试:

  1. 在解决方案资源管理器中右键单击项目
  2. 选择“添加参考”
  3. 在“添加引用”对话框中,切换到“COM”选项卡
  4. 选中“Microsoft Shell 控件和自动化”

我猜如果您没有安装 Windows SDK,您可能会丢失 AxImp.exe,并且 Visual Studio 可能无法创建允许您使用 typelib 的存根程序集。我无法想象这怎么可能发生。如果您安装了 Visual Studio,那么您应该已经获得了 SDK。

于 2016-12-21T17:03:46.737 回答