我有一台 Windows 10 Pro PC,没有域,我不在系统驱动器上使用 BitLocker,但使用 BitLocker 和密码(没有 TPM)加密了一些固定数据驱动器。
当我想解锁这些驱动器时,我可以在文件资源管理器中选择它们并选择Unlock Drive...
,输入密码后,驱动器被解密,我就可以使用它了。
因为我有几个驱动器使用相同的密码,所以我编写了一个脚本来同时解锁所有驱动器。
Unlock-BitLocker -MountPoint X: -Password $myPassword
以提升的管理员身份执行时,此操作正常,但当我以普通标准用户身份运行脚本时,它会失败:
Get-CimInstance:访问被拒绝
WBEM_E_ACCESS_DENIED (0x80041003) 当前用户没有权限执行该操作。
我假设文件资源管理器和 PowerShell BitLocker 模块都使用相同的 Win32 API,为什么一个可以作为标准用户工作,而另一个却不能?
使用时:
manage-bde –unlock E: -rp password
我得到:
BitLocker Drive Encryption: Configuration Tool version 10.0.14393
ERROR: An attempt to access a required resource was denied.
Check that you have administrative rights on the computer.
使用进程监视器,我可以看到以下注册表项的访问被拒绝:
HKLM\Software\Microsoft\WBEM\CIMOM
我还发现文件资源管理器内容菜单调用可执行文件:
%systemroot%\System32\bdeunlock.exe
显示一个小弹出窗口来输入密码。
使用时,进程监视器中会显示bdeunlock.exe
无访问权限HKLM\Software\Microsoft\WBEM\CIMOM
。因此,似乎无需访问该密钥即可解锁驱动器。
看起来 PowerShell cmdlet 都manage-bde.exe
使用 WMI:
Get-CimInstance
-Namespace "root\cimv2\Security\MicrosoftVolumeEncryption"
-ClassName Win32_EncryptableVolume
标准用户无权访问该内容。
但是可以直接使用(Bitlocker API 文件)中的bdeunlock.exe
功能,而无需先使用 WMI。FveOpenVolumeW
FVEAPI.dll
有没有办法以标准用户的身份在命令行上解锁 Bitlocked 固定数据驱动器?
答案1
您可以授予标准用户或他们所属的安全组根据从中找到的路径对 WMI 对象的明确访问权限wmimgmt.msc
。
这样,您就不需要授予帐户本地管理员或提升的权限,他们只会根据需要对相关 WMI 命名空间具有所需的精确和明确的访问权限,而无需进一步执行操作所需的最低权限。
指示
屏幕截图示例
更多资源
答案2
我在问题本身中解释了我的研究,并进一步研究了这一点。
使用 PowerShell cmdlet,Unlock-Bitlocker
因为它的代码在每台 Windows 机器上均以明文形式提供。
执行 cmdlet 期间的第一个错误发生在调用以下内容时:
Get-CimInstance
-Namespace "root\cimv2\Security\MicrosoftVolumeEncryption" `
-ClassName Win32_EncryptableVolume
我得到了Access Denied
@Homey_D_Clown_IT 建议更改相关 WIM 对象的安全性,为此,请打开wmimgmt.msc
,右键单击WMI Control (Local)
左侧节点并单击Properties
。选择Security
选项卡,然后找到对象Root\CIMV2\Security\MicrosoftVolumeEncryption
,单击Security
按钮。添加您要允许解锁位锁驱动器的组或用户。选中允许Execute Methods
权限。
完成此操作后,标准用户可以使用该manage-bde.exe
工具解锁驱动器:
manage-bde -unlock X: -pw
问题是,这会提示用户输入密码,而我此时有四个驱动器需要解锁,而且我只想输入一次密码。
在 PowerShell 中使用 Unlock-Bitlocker cmdlet 现在可以绕过上一个错误,但会显示另一个错误:
Get-BitLockerVolumeInternal 中拒绝访问 ...
查看 PowerShell 模块的代码,当代码尝试访问恢复密码时,它会中断,而这只能由管理员完成。如果我更改代码以忽略该错误并继续运行而不是中断,它就会正常工作。
但这是一个糟糕的黑客行为,因为我必须取得模块文件的所有权,更改权限,然后编辑代码。所有这些都是我不应该对 Windows 系统文件执行的操作,而且下次 Microsoft 更新该 PowerShell 模块时,我的更改将被覆盖。
一个解决方案是将相关代码片段复制到我自己的 PowerShell 模块中,然后使用该模块。这可能甚至不合法。
另一个解决方案是删除恢复密码:
manage-bde -protectors -delete X: -type recoverypassword
这样,我就只剩下一个 Bitlocked 驱动器保护器,即普通密码。
为什么从使用 BitLocker 加密的固定数据驱动器中删除恢复密码是个好主意?
任何管理员都可以看到恢复密码并使用它来解密驱动器 WFT!
我的目的是保护驱动器上的数据不被他人获取。有人可能会窃取我的电脑,启动实时 CD Linux,并获取我安装的 Windows 上的管理员帐户的访问权限。
删除恢复密码后,我可以使用原始Unlock-Bitlocker
cmdlet 作为标准用户来解锁我的驱动器。我仍然需要如上所述更改 WMI 对象的权限。
编辑:在 Windows 10 更新后,在这种情况下,14939.222
权限被root\cimv2\Security\MicrosoftVolumeEncryption
重置,我不得不再次更改它们。所以这似乎不是一个永久的解决方案。
由于 Windows 更新进行了重置,我决定编写脚本来更改 WMI 权限。我使用的Set-WmiNamespaceSecurity.ps1
是此处提供的微软博客文章,那么我可以使用:
.\Set-WmiNamespaceSecurity.ps1 -namespace "root/cimv2/Security/MicrosoftVolumeEncryption" -operation add -account MyUserName -permissions MethodExecute,Enable
答案3
恐怕您无法以自己的身份运行脚本,除非您完全禁用计算机上的 UAC。但是,如果您的问题与简化脚本的使用有关,我前段时间找到了一个解决方案,每次我需要以提升的权限运行脚本时,我都会使用它。
If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
{
$arguments = $myInvocation.mycommand.definition
Start-Process powershell -Verb runAs -ArgumentList $arguments
Break
}
在脚本开头插入此代码后,它将自动以提升的权限重新运行脚本,并将其所有参数再次传递给新的“提升的实例”。
答案4
我使用进程监视器查看了该进程,以找出在 Gui 中选择“解锁驱动器”时 Windows 资源管理器究竟做了什么。它恰好启动了 bdeunlock.exe,然后启动了驱动器号。这似乎是一个提示输入密码的应用程序。这在使用标准用户权限时有效。