V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
vitozyf
V2EX  ›  程序员

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

  •  
  •   vitozyf · 2021-04-13 15:18:39 +08:00 · 1369 次点击
    这是一个创建于 1312 天前的主题,其中的信息可能已经有所发展或是发生改变。

    代码:

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

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

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

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

    第 1 条附言  ·  2021-04-13 16:23:17 +08:00

    尝试如下代码给C:\Windows\INF\usbstor.inf文件赋给读取和写入权限,但是并不生效,执行My.Computer.FileSystem.RenameFile("C:\Windows\INF\usbstor.inf", "usbstop.inf")时仍然提示被访问的路径被拒绝

    Dim f2 As New FileIOPermission(FileIOPermissionAccess.Write Or FileIOPermissionAccess.Read, "C:\Windows\INF\usbstor.inf")
    Try
       f2.Demand()
    My.Computer.FileSystem.RenameFile("C:\Windows\INF\usbstor.inf", "usbstop.inf")
       Catch s As SecurityException
       MsgBox(s.Message, MsgBoxStyle.Information)
    End Try
    
    第 2 条附言  ·  2021-04-14 09:04:43 +08:00

    抱歉,题目确实提的有点问题,没说清楚整个问题。

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

    为此我在网上找到以上方法, 修改 C:\Windows\INF\usbstor.inf 文件名让系统读不到,则不会出现这个 usb 存储设备依然被识别的问题,于是出现了题目的问题。

    但是,在我尝试修改该文件名后,重启电脑能查到注册表值为 4,usbstor.inf文件名已经被修改,但是系统仍然能识别 usb 存储设备。

    对此请问有人有好的建议么?

    14 条回复    2021-04-15 11:03:12 +08:00
    ho121
        1
    ho121  
       2021-04-13 15:22:17 +08:00
    Windows 文件夹下的东西就是被系统保护的,不能随意修改。如果一定要作死修改,可以把文件的权限和拥有者改掉。
    typetraits
        2
    typetraits  
       2021-04-13 15:26:36 +08:00   ❤️ 1
    有两种方法
    1. 以管理员身份运行你的程序,通过代码获取该文件所有权,然后更改权限允许你的账户读写,之后修改文件,修改完毕后再恢复权限
    2. 使用网上的各种提权工具,让你的程序直接以 System 或 TrustedInstaller 用户权限运行,这样你的代码就不用修改,但是缺点是必须通过提权工具才能执行
    vitozyf
        3
    vitozyf  
    OP
       2021-04-13 15:28:25 +08:00
    @ho121 有没有办法从应用级别直接申请最高的权限?否则使用者要自己手动更改目录权限的话很麻烦。尝试申请的 requireAdministrator 或者 highestAvailable 权限貌似都没法 =_=
    vitozyf
        4
    vitozyf  
    OP
       2021-04-13 15:44:30 +08:00
    @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
        5
    typetraits  
       2021-04-13 18:39:05 +08:00
    @vitozyf #4 因为这个文件所有者是 NT SERVICE\TrustedInstaller,你要先修改文件所有者才行
    ysc3839
        6
    ysc3839  
       2021-04-13 21:33:48 +08:00 via Android
    怀疑是 X-Y Problem https://coolshell.cn/articles/10804.html
    你最终要实现什么?
    wevsty
        7
    wevsty  
       2021-04-13 22:59:11 +08:00
    应该是需要 TrustedInstaller 权限来操作
    vitozyf
        8
    vitozyf  
    OP
       2021-04-14 09:02:40 +08:00
    @ysc3839 抱歉,确实提的有点问题。

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

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

    对此您有什么建议么?
    no1xsyzy
        9
    no1xsyzy  
       2021-04-14 09:41:07 +08:00
    TrustedInstaller > SYSTEM > Admin
    你这样提权似乎是提不到 TrustedInstaller 的
    搜索了一下,重启电脑的问题似乎是 BIOS 中将 USB 存储启动了(为了检查启动介质?)
    Windows 内除了弹出以外没有办法,你考虑下做个移除可移动存储的工具放 shell:startup 里去吧
    g00001
        10
    g00001  
       2021-04-14 11:51:44 +08:00
    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
        11
    vitozyf  
    OP
       2021-04-14 13:41:11 +08:00
    @g00001 非常感谢

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

    你要么进 BIOS 设置关掉,要么 RunService 里塞个自动弹出所有 USB 存储的工具。
    no1xsyzy
        13
    no1xsyzy  
       2021-04-14 15:40:10 +08:00
    @no1xsyzy s/之后 Windows 会继承此继承情况 /之后 Windows 会继承此启用情况 /
    vitozyf
        14
    vitozyf  
    OP
       2021-04-15 11:03:12 +08:00
    @no1xsyzy 测试了一下大势至管理软件的做法,好像只在设备管理器层面做的处理,不过要一直挂在后台保护
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5385 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 46ms · UTC 08:00 · PVG 16:00 · LAX 00:00 · JFK 03:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.