使用命令行工具安装或删除根 CA 证书时证书实用程序或者证书管理器,Windows 使用 MessageBox 要求用户确认(对于除根 CA 以外的证书,不会询问此问题),即使对于当前用户的根 CA 证书存储也是如此。
对于无人值守的证书更新来说,这很麻烦。
我在 Windows XP、Vista 和 7 上看到过这种行为(我还没有检查 Windows Server 2003 和 2008,但我认为他们也会问这个问题)。
我有两个问题:
- 为什么即使您从命令行工具安装/删除它,Windows 也会询问这个问题?
- 我怎样才能抑制这种情况(除了观察出现的对话框并发送 Windows 消息以按下“是”按钮)?
MessageBox 确认对话框如下所示:
[Root Certificate Store]
Do you want to DELETE the following certificate from the Root Store?
...
[&Yes] [&No]
和这个:
[Security Warning]
You are about to install a certificate from a certification authority (CA) claiming to represent:
...
[&Yes] [&No]
--杰伦
答案1
最简单的解决方案是将答案合并到脚本中,如下所示:
echo Y | CertUtil.exe ....
此方法并不适用于所有程序,因此仍需要您进行一些测试。
对于消息框,您可以使用nircmd使用dlg
参数。
在脚本中,您还可以使用内置命令timeout /t seconds
为消息框指定显示时间(秒)。
以下是帮助文件的摘录:
nircmd.exe dlg [Process Name] [Window Title] [Action] [Parameters]
允许您与 Windows 的标准对话框和消息框进行交互。当打开对话框时,您可以使用此命令“单击”确定/取消/是/否按钮,或填写对话框中的文本框。
以下命令将对 Explorer 进程的任何问题对话框选择“是”答案:
dlg "explorer.exe" "" click yes
以下命令将为任何流程的任何问题对话框选择“取消”答案:
dlg "" "" click cancel
参数说明:
[进程名称]:指定创建所需窗口的进程。您可以仅指定进程名称或进程的完整路径。如果此参数为空字符串(“”),则命令将在任意进程上执行。
[窗口标题]:指定要执行操作的窗口的标题。如果此参数为空字符串(“”),则无论窗口标题是什么,该命令都会在任何窗口上执行。
[操作]:您可以指定以下选项之一:
单击:单击指定的按钮。您可以指定以下预定义值之一(仅适用于标准 Windows 对话框!):是、否、确定、取消、重试、忽略、关闭、帮助。您还可以将任何控件 ID 指定为数值。settext
:设置指定控件的文本。此操作的第一个参数指定控件的 ID,第二个参数指定文本。
答案2
对于从用户存储中删除受信任的根证书等不需要任何非本机软件的情况,我使用 reg delete 从注册表中删除证书。请注意,下面的 X 代表证书的指纹。
reg delete HKCU\Software\Microsoft\SystemCertificates\Root\Certificates\XXXXXXXXXXXXXXXXXXXXXXX /f
答案3
对于像我一样正在寻找如何通过 nircmd 对 certutil.exe 窗口响应“是”的人,请按照命令进行操作。
C:\Users\<user>\Desktop>nircmdc.exe dlg "certutil.exe" "" click yes execmd certutil.exe -p xxxxx -user -importpfx cert.p12