禁止BlueStacks开机自启动

BlueStacks(简称BS)是很好用的Android虚拟机,但它的设计较为激进,没有选择是否开机启动的设置。即使将相关服务的启动类型改为“手动”或“禁用”,在下次启动BS的时候它仍会将启动类型改为“自动”。
经过一些尝试,终于通过注册表权限控制彻底禁止了BS开机自启动。

第一步:停用启动项

运行msconfig,切换到启动标签,将BlueStacks前面的勾去掉。

第二步:停用服务

运行services.msc,将BlueStacks Android Service和BlueStacks Log Rotator Service的启动类型改为手动。

第三步:设置权限禁止修改服务

运行regedit,找到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\BstHdAndroidSvc 这个项,可以看到里面有个 Start 键,键值为 2 表示自动启动,键值为 3 表示手动启动。目标就是让BS修改不了这个键。


3.1 更改拥有者

右击 BstHdAndroidSvc 项 -> 权限… -> 高级 -> 所有者 -> 其他用户或组…,输入你自己的用户名,确定。选中新出现的你的用户名,应用。

3.2 修改权限

切换到“权限”标签,列表中应该已经自动增加了你的用户名,双击可以看到所有权限都是允许,这个不用管他。 回到“权限”标签,点“添加”,输入 SYSTEM,确定。在弹出的对话框中,“应用于:”选择“只有该项”,权限除了“完全控制”、“查询数值”、“枚举子项”、“通知”和“读取控制”之外,其他全部勾选“拒绝”。确定,确定,再确定。

3.3 验证设置

启动BS,启动完后F5刷新一下注册表,看 BstHdAndroidSvc 项里 Start 键的值是否仍为 3,如果变成了 2 说明设置有误。

3.3′ 快速验证(代替3.3的方法)

若嫌启动BS来验证太耗时间,可以运行services.msc,找到 BlueStacks Android Service,描述应当是空的,而不是<读取错误>,否则说明设置有误(太严格)。然后尝试将该服务的启动类型设置为自动,如果提示“拒绝访问”,说明设置正确,否则设置有误(太宽松)。

第四步:停用驱动

在翻注册表的时候,你可能已经注意到有一个叫 BstHdDrv 的项,DisplayName 键的值是 BlueStacks Hypervisor
这是一个驱动级别的服务,BlueStacks Android Service服务依赖它,但无法在services.msc里看到它。要修改这个服务,可以运行devmgmt.msc,点查看 -> 显示隐藏的设备 -> 非即插即用驱动程序,双击Bluestacks Hypervisor,点“驱动程序”标签,“启动类型”改为“请求”。尽管驱动级的服务一般不建议乱动,但经过简单测试,似乎并不影响BS的启动,而且BS启动时不会修改该服务的启动类型。

其他提示

Extra 1: 注册表权限错误的处理

折腾注册表的时候有时会把自己权限锁死,此时不必慌张,只要你是管理员就能改回来。
BstHdAndroidSvc 项为例,(无视所有警告)右击该项 -> 权限… -> 高级 -> 所有者,选中你的用户名(如果没有,点“其他用户或组…”添加),应用,这时你就有修改该项权限的权限了。 切换到“权限”标签,点添加,输入你的用户名,确定,弹出的对话框中对“完全控制”勾选“允许”,确定,勾选“包括可从该对象的父项继承的权限”,确定。这时你就能看到所有权限项目,也能修改该项所有内容的权限了。 再点“高级”,可以看到有些权限的“继承于”是“<不是继承的>”,这些都是你折腾时留下的,可以删除掉。

Extra 2: 原理及其他说明

经过以上修改之后,SYSTEM 部分权限被限制,而你的用户账户却仍有所有权限。 无论是你从services.msc修改启动类型,还是BS通过系统API修改,用户名都是 SYSTEM;但你用regedit修改,用户名是你自己。所以你仍然能在regedit里修改 BstHdAndroidSvc 项,但你通过services.msc和BS通过API都无法修改该项。 另外要指出的是,所幸目前版本 BstHdAndroidSvc 项里没有其他需要写入的键,否则以上方法会导致写入失败、程序无法启动。更新时建议暂时解开权限。


另一种思路

由“通宵只为早饭”制作的BlueStacks启动器启发(说明文件里有源代码)。
既然BS启动之后会修改服务的启动类型,那么在它改完后再修改回来即可。
最简单的是命令行运行 sc config BstHdAndroidSvc start= demand,但需要管理员权限,批处理提权要输密码很麻烦。况且为了在BS改完后再改回,需要一定的延迟,而批处理没有自带的延迟命令,写起来又是一堆。
综上,该思路可行,但实现起来还是写个exe比较方便,即上面提到的启动器。有兴趣的也可以研究下PowerShell。

发表评论

您的电子邮箱地址不会被公开。