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

2021-04-13 15:18:39 +08:00
 vitozyf

代码:

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

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

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

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

1271 次点击
所在节点    程序员
14 条回复
ho121
2021-04-13 15:22:17 +08:00
Windows 文件夹下的东西就是被系统保护的,不能随意修改。如果一定要作死修改,可以把文件的权限和拥有者改掉。
typetraits
2021-04-13 15:26:36 +08:00
有两种方法
1. 以管理员身份运行你的程序,通过代码获取该文件所有权,然后更改权限允许你的账户读写,之后修改文件,修改完毕后再恢复权限
2. 使用网上的各种提权工具,让你的程序直接以 System 或 TrustedInstaller 用户权限运行,这样你的代码就不用修改,但是缺点是必须通过提权工具才能执行
vitozyf
2021-04-13 15:28:25 +08:00
@ho121 有没有办法从应用级别直接申请最高的权限?否则使用者要自己手动更改目录权限的话很麻烦。尝试申请的 requireAdministrator 或者 highestAvailable 权限貌似都没法 =_=
vitozyf
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
2021-04-13 18:39:05 +08:00
@vitozyf #4 因为这个文件所有者是 NT SERVICE\TrustedInstaller,你要先修改文件所有者才行
ysc3839
2021-04-13 21:33:48 +08:00
怀疑是 X-Y Problem https://coolshell.cn/articles/10804.html
你最终要实现什么?
wevsty
2021-04-13 22:59:11 +08:00
应该是需要 TrustedInstaller 权限来操作
vitozyf
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
2021-04-14 09:41:07 +08:00
TrustedInstaller > SYSTEM > Admin
你这样提权似乎是提不到 TrustedInstaller 的
搜索了一下,重启电脑的问题似乎是 BIOS 中将 USB 存储启动了(为了检查启动介质?)
Windows 内除了弹出以外没有办法,你考虑下做个移除可移动存储的工具放 shell:startup 里去吧
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
2021-04-14 13:41:11 +08:00
@g00001 非常感谢

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

你要么进 BIOS 设置关掉,要么 RunService 里塞个自动弹出所有 USB 存储的工具。
no1xsyzy
2021-04-14 15:40:10 +08:00
@no1xsyzy s/之后 Windows 会继承此继承情况 /之后 Windows 会继承此启用情况 /
vitozyf
2021-04-15 11:03:12 +08:00
@no1xsyzy 测试了一下大势至管理软件的做法,好像只在设备管理器层面做的处理,不过要一直挂在后台保护

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/770347

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX