如何审核 Visual C++ 运行时版本使用情况
Microsoft Visual C++ Redistributable 和 Visual Studio C++ Runtime(统称为“VC 运行时”)是许多应用程序的关键组件。 在整个网络中,计算机可能仍在运行一些应用程序,而这些应用程序安装并使用不再受支持的 VC 运行时版本。 可以使用 NTFS 文件审核来识别此类用法,例如将这些应用程序替换为使用 VC 运行时支持的版本的应用程序。 本指南将指导你设置 NTFS 文件审核,提供故障排除提示,并重点介绍常规审核的好处。
有关不再受支持的 VC 运行时版本的详细信息,请参阅 Microsoft Visual C++ Redistributable 最新支持的下载。
启用 NTFS 文件审核以确定 VC 运行时使用情况
本指南提供手动启用 NTFS 文件审核和查看审核事件的步骤,以确定哪些应用程序正在调用 VC 运行时的不受支持的版本。 由于应用程序可以使用多个文件,本指南还演示如何使用 PowerShell 的 Get-Acl
和 Set-Acl
cmdlet 来更新审核权限。 有关如何配置文件的审核策略的详细信息,请参阅 对文件或文件夹应用基本审核策略。
在系统上手动启用对象访问审核
启用文件级别审核之前,必须启用对象访问:
- 打开 本地组策略编辑器,请按
Windows
+R
打开 运行 对话框。 然后键入gpedit.msc
并按 Enter。 - 导航到 计算机配置>Windows 设置>安全设置>高级审核策略配置>系统审核策略>对象访问。
- 双击“审核文件系统”。 在 审核文件系统属性 对话框中,选择 配置以下审核事件,>成功>正常。
- 关闭 本地组策略编辑器。
或者,可以使用 auditpol.exe
启用对象访问:
- 使用
AuditPol.exe /get /category:"Object Access"
列出命令行中的当前设置。 - 使用
AuditPol.exe /set /category:"Object Access" /subcategory:"File System" /success:enable
启用对象访问。
手动启用文件审核
若要监视访问 VC 运行时文件的进程,请对 VC 运行时文件启用审核:
- 右键单击要审核的文件,选择“属性”,然后选择“安全 ”选项卡。有关查找已安装的 VC 运行时文件的详细信息,请参阅 VC 运行时安装位置。
- 选择“高级”。
- 在 高级安全设置 对话框中,选择 审核 选项卡,然后选择 继续。
- 若要添加新的审核规则,请选择“添加。 在 审核条目 对话框中,选择一个主体,然后键入要添加的用户或组的名称,例如 (每个人),然后选择 确定。
- 在“类型”中,确保已选择“成功”。
- 选择 显示高级权限>清除所有>遍历文件夹/执行文件>确定。
- 现在,“审核”条目中应该有一行新内容与所选的内容相匹配。 选择“确定”。
- 在“属性 对话框”中,选择“确定”。
现在,已为文件启用审核规则。
手动查看审核日志
NTFS 文件审核会为每一个包含审核权限并正在被进程访问的文件生成 “事件 4663:尝试访问对象”。
- 按
Windows
+R
打开“运行”对话框,打开“事件查看器”。 然后键入eventvwr.msc
并按 Enter。 - 通过展开 Windows 日志>安全,导航到“事件查看器”中的“安全”日志。 结果窗格列出安全事件。
- 通过在 操作 窗格中选择 “筛选当前日志...” 来查找审核事件。 在“包括/排除事件 ID”文本框中输入 4663,将事件范围缩小到事件 ID 4663(文件系统类别的审核成功)。
有关文件访问审核事件 4663 的示例,请参阅 “4663(S):尝试访问对象”。
使用 PowerShell 审核 VC 运行时使用情况
作为概述,使用 PowerShell 更新文件审核权限遵循以下步骤:
- 定义要应用于文件的 文件系统审核规则。
- 使用
Get-Acl
获取文件的安全描述符。 - 将审核规则 应用于安全描述符。
- 使用
Set-Acl
对原始文件应用更新的安全描述符。 - 使用
Get-WinEvent
查看文件访问审核事件 4663 记录。
PowerShell:审核支持不足的 VC 运行时文件
通过以下 PowerShell 代码,可以审核不再受支持的已安装的 VC 运行时文件。
function Get-AuditRuleForFile {
$auditRuleArguments = 'Everyone' <# identity #>,
'ExecuteFile, Traverse' <# fileSystemRights #>,
'Success' <# flags #>
$auditRule = New-Object System.Security.AccessControl.FileSystemAuditRule($auditRuleArguments)
return $auditRule
}
function Set-FileAuditRule {
param (
[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[string]$file,
[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[System.Security.AccessControl.FileSystemAuditRule]$auditRule
)
$existingAcl = Get-Acl -Path $file
$existingAcl.AddAuditRule($auditRule) | Out-Null
Set-Acl -Path $file -AclObject $existingAcl
}
$newAuditRule = Get-AuditRuleForFile
# Visual Studio Redistributable for 2005 (VC++ 8.0) and 2008 (VC++ 9.0)
Get-ChildItem "$ENV:SystemRoot\WinSxS\Fusion" -filter '*.dll' -ErrorAction SilentlyContinue -Recurse |
Where-Object FullName -IMatch 'microsoft\.vc[89]0' |
ForEach-Object {
Set-FileAuditRule $_.FullName $newAuditRule
}
# Visual Studio Redistributable for 2010 (VC++ 10.0), 2012 (VC++ 11.0) and 2013 (VC++ 12.0)
$languageCodes = 'chs|cht|deu|enu|esn|fra|ita|jpn|kor|rus'
$versions = '(1[012]0)'
$regex = "^((atl|msvc[pr]|vcamp|vccorlib|vcomp)$versions|mfc$versions(u|$languageCodes)?|mfcm$versions(u)?)\.dll$"
Get-ChildItem "$ENV:SystemRoot\SysWOW64","$ENV:SystemRoot\System32" -filter '*.dll' |
Where-Object Name -imatch $regex |
ForEach-Object {
Set-FileAuditRule $_.FullName $newAuditRule
}
PowerShell:查看文件审核事件
PowerShell 提供 Get-WinEvent
来获取各种事件日志的事件记录,如以下 PowerShell 代码中所示,其中列出了过去 24 小时内的所有审核事件 4663 记录:
function Get-AuditEntries {
param (
[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[System.DateTime]$oldestTime
)
Get-WinEvent -FilterHashtable @{LogName='Security';Id=4663;StartTime=(Get-Date $oldestTime)} |
ForEach-Object {
$record = [ordered]@{}
$record['TimeCreated'] = $_.TimeCreated
$accessName = ($_.Message |
Select-String -Pattern "Accesses:[\t\s]+(?<Accesses>.+)").Matches.Groups[1]
([xml]$_.ToXML()).Event.EventData.ChildNodes |
ForEach-Object -Begin {
$record[$accessName.Name]=$accessName.Value.Trim()
} -Process {
$record[$_.Name] = $_.'#text'
}
[PSCustomObject]$record
} |
Where-Object { $_.ObjectName -imatch '\.dll$'}
}
Get-AuditEntries -oldestTime (Get-Date).AddHours(-24)
TimeCreated : 11/20/2024 5:00:11 AM
Accesses : Execute/Traverse
SubjectUserSid : \*\*\*\*\*
SubjectUserName : \*\*\*\*\*
SubjectDomainName : WORKGROUP
SubjectLogonId : \*\*\*\*\*
ObjectServer : Security
ObjectType : File
ObjectName : C:\\Windows\\WinSxS\\amd64\_microsoft.vc90.crt\_1fc8b3b9a1e18e3b\_9.0.30729.9635\_none\_08e2c157a83ed5da\\msvcr90.dll
HandleId : 0x93c
AccessList : %%4421
AccessMask : 0x20
ProcessId : 0x24d4
ProcessName : C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe
ResourceAttributes : S:AI
审核 VC 运行时使用情况后的后续步骤
确定使用 VC 运行时文件的进程或安装了 VC 可再发行组件的应用程序后,请卸载这些应用程序或将其升级到不依赖于不支持的 VC 运行时的较新版本。
某些Microsoft应用程序需要旧版 VC 运行时。 有关详细信息,请参阅 Visual C++ Redistributable 和运行时库常见问题解答 | Microsoft Learn。
VC 运行时安装位置
下面是安装 VC 运行时的每个版本的位置:
Visual Studio 版本 | 安装位置 |
---|---|
Visual Studio 2013 (VC++ 12.0) | %SystemRoot%\\System32, %SystemRoot%\\SysWOW64 |
Visual Studio 2012 (VC++ 11.0) | %SystemRoot%\\System32, %SystemRoot%\\SysWOW64 |
Visual Studio 2010 (VC++ 10.0) | %SystemRoot%\\System32, %SystemRoot%\\SysWOW64 |
Visual Studio 2008 (VC++ 9.0) | %SystemRoot%\\WinSxS\\Fusion |
Visual Studio 2005 (VC++ 8.0) | %SystemRoot%\\WinSxS\\Fusion |
另请参阅
重新分发 Visual C++ 文件
最新支持的 Visual C++ 下载
生命周期常见问题解答 - Visual C++ 可再发行组件库和运行时库
Visual Studio 版本之间的 C++ 二进制兼容性