求解一个 VB 代码修改文件名的问题

vitozyf 28天前 17

代码:

My.Computer.FileSystem.RenameFile("C:\Windows\INF\usbstor.inf", "usbstop.inf")

本意为修改 C:\Windows\INF\usbstor.inf 的文件名,提示错误“对路径的访问被拒绝”

理解为权限问题,但是程序权限修改为 requireAdministrator或者highestAvailable都不行,google 没解决

ps: 手动修改该文件名系统也会提示你需要trustedinstaller提供的权限才能对此文件进行更改,无法修改

最新回复 (14)
  • ho121 23天前
    引用 2
    Windows 文件夹下的东西就是被系统保护的,不能随意修改。如果一定要作死修改,可以把文件的权限和拥有者改掉。
  • typetraits 23天前
    引用 3
    有两种方法
    1. 以管理员身份运行你的程序,通过代码获取该文件所有权,然后更改权限允许你的账户读写,之后修改文件,修改完毕后再恢复权限
    2. 使用网上的各种提权工具,让你的程序直接以 System 或 TrustedInstaller 用户权限运行,这样你的代码就不用修改,但是缺点是必须通过提权工具才能执行
  • 楼主 vitozyf 23天前
    引用 4
    @ho121 有没有办法从应用级别直接申请最高的权限?否则使用者要自己手动更改目录权限的话很麻烦。尝试申请的 requireAdministrator 或者 highestAvailable 权限貌似都没法 =_=
  • 楼主 vitozyf 23天前
    引用 5
    @typetraits 我没有写过 VB,因此在网上找到以下代码以尝试方法 1 中`通过代码获取该文件所有权`,但是并未成功。这段代码是 C#的例子[https://docs.microsoft.com/zh-tw/dotnet/api/system.security.permissions.fileiopermission?view=net-5.0]( https://docs.microsoft.com/zh-tw/dotnet/api/system.security.permissions.fileiopermission?view=net-5.0)

    ```
    FileIOPermission f2 = new FileIOPermission(FileIOPermissionAccess.Read, "C:\\test_r");
    f2.AddPathList(FileIOPermissionAccess.Write | FileIOPermissionAccess.Read, "C:\\example\\out.txt");
    try
    {
    f2.Demand();
    }
    catch (SecurityException s)
    {
    Console.WriteLine(s.Message);
    }
    ```
  • typetraits 23天前
    引用 6
    @vitozyf #4 因为这个文件所有者是 NT SERVICE\TrustedInstaller,你要先修改文件所有者才行
  • ysc3839 23天前
    引用 7
    怀疑是 X-Y Problem https://coolshell.cn/articles/10804.html
    你最终要实现什么?
  • wevsty 23天前
    引用 8
    应该是需要 TrustedInstaller 权限来操作
  • 楼主 vitozyf 23天前
    引用 9
    @ysc3839 抱歉,确实提的有点问题。

    我最终想要实现的是禁用 usb 存储的功能。目前的方案是将注册表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\USBSTOR\Start 的值设置为 4,当前目的会生效。但是电脑重启后,虽然该值任然是 4,但是 usb 存储设备依然能被识别。

    为此我在网上找到以上方法, 修改 C:\Windows\INF\usbstor.inf 文件名让系统读不到,则不会出现这个 usb 存储设备依然被识别的问题。但是,在我尝试修改该文件名后,重启电脑能查到注册表值为 4,usbstor.inf 文件名已经被修改,但是系统仍然能识别 usb 存储设备。

    对此您有什么建议么?
  • no1xsyzy 23天前
    引用 10
    TrustedInstaller > SYSTEM > Admin
    你这样提权似乎是提不到 TrustedInstaller 的
    搜索了一下,重启电脑的问题似乎是 BIOS 中将 USB 存储启动了(为了检查启动介质?)
    Windows 内除了弹出以外没有办法,你考虑下做个移除可移动存储的工具放 shell:startup 里去吧
  • g00001 23天前
    引用 11
    VB 不会,用 aardio 试了一下提权以后可以改名,代码如下:

    //RUNAS//
    import fsys;
    import fsys.acl;

    //获取权限
    fsys.acl.takeOwn("C:\Windows\INF\usbstor.inf")
    fsys.acl.icacls("C:\Windows\INF\usbstor.inf","/grant","Administrators:(F)")

    //先备份为 usbstor2.inf
    string.save("C:\Windows\INF\usbstor2.inf",string.load("C:\Windows\INF\usbstor.inf") )

    //移除系统属性
    fsys.attrib("C:\Windows\INF\usbstor.inf",4/*_FILE_ATTRIBUTE_SYSTEM*/)

    //删除文件实现改名效果
    fsys.delete("C:\Windows\INF\usbstor.inf")
  • 楼主 vitozyf 23天前
    引用 12
    @g00001 非常感谢

    对于最终目的来说,修改文件 /删除文件,在电脑重启后对 usb 的禁用修改,仍然失效了。目前看一下其他办法
  • no1xsyzy 23天前
    引用 13
    @vitozyf 那不就验证的了 #9 的说法?
    因为你对 Windows 做的任何操作都必须在进入 Windows 之后才会起作用
    但是重启时 BIOS/UEFI 会先启用此 USB 存储,之后 Windows 会继承此继承情况。
    重启后重新拔插 USB 存储就不会出现了吧

    你要么进 BIOS 设置关掉,要么 RunService 里塞个自动弹出所有 USB 存储的工具。
  • no1xsyzy 23天前
    引用 14
    @no1xsyzy s/之后 Windows 会继承此继承情况 /之后 Windows 会继承此启用情况 /
  • 楼主 vitozyf 23天前
    引用 15
    @no1xsyzy 测试了一下大势至管理软件的做法,好像只在设备管理器层面做的处理,不过要一直挂在后台保护
  • 游客
    16
返回