次の方法で共有


Visual C++ ランタイム バージョンの使用状況を監査する方法

Microsoft Visual C++ 再頒布可能パッケージと Visual Studio C++ ランタイム (総称して"VC ランタイム") は、多くのアプリケーションの重要なコンポーネントです。 ネットワーク全体で、VC ランタイムのサポート外バージョンをインストールして使用するアプリケーションがマシンで引き続き実行されている可能性があります。 NTFS ファイル監査を使用して、サポートされているバージョンの VC ランタイムを使用するアプリケーションに置き換える手順として、このような使用状況を特定できます。 このガイドでは、NTFS ファイル監査の設定、トラブルシューティングのヒント、および通常の監査の利点について説明します。

サポートされなくなった VC ランタイムのバージョンの詳細については、 Microsoft Visual C++ 再頒布可能パッケージの最新のサポートされているダウンロードを参照してください。

NTFS ファイル監査を有効にして VC ランタイムの使用状況を判断する

このガイドでは、NTFS ファイルの監査を手動で有効にし、監査イベントを確認して、サポートされていないバージョンの VC ランタイムを呼び出しているアプリケーションを特定する手順について説明します。 このガイドでは、アプリケーションで使用できるファイルがいくつか存在するため、PowerShell の Get-Acl コマンドレットと Set-Acl コマンドレットを使用して監査アクセス許可を更新する方法についても説明します。 ファイルの監査ポリシーを構成する方法の詳細については、「ファイル またはフォルダーに基本的な監査ポリシーを適用する」を参照してください。

システムでオブジェクト アクセス監査を手動で有効にする

ファイル レベルの監査を有効にする前に、オブジェクト アクセスを有効にする必要があります。

  1. Windows + Rキーを押してローカル グループ ポリシー エディターを開き、[実行] ダイアログを開きます。 次に、「 gpedit.msc 」と入力し、 Enter キーを押します。
  2. コンピューターの構成>Windows の設定>セキュリティ設定>Advanced 監査ポリシーの構成>System 監査ポリシー>Object Access に移動します。
  3. [ ファイル システムの監査] をダブルクリックします。 [ ファイル システムのプロパティの監査 ] ダイアログで、[ 次の監査イベントの構成>Success>OK を選択します。
  4. ローカル グループ ポリシー エディター を閉じます。

または、 auditpol.exe を使用してオブジェクト アクセスを有効にすることもできます。

  1. AuditPol.exe /get /category:"Object Access"を使用して、コマンド ラインから現在の設定を一覧表示します。
  2. AuditPol.exe /set /category:"Object Access" /subcategory:"File System" /success:enableを使用してオブジェクト アクセスを有効にします。

ファイルの監査を手動で有効にする

VC ランタイム ファイルにアクセスするプロセスを監視するには、VC ランタイム ファイルの監査を有効にします。

  1. 監査するファイルを右クリックし、[ プロパティ] を選択し、[ セキュリティ ] タブを選択します。インストールされている VC ランタイム ファイルの検索の詳細については、「 VC ランタイムのインストール場所」を参照してください。
  2. [Advanced] \(詳細設定) を選択します。
  3. [ セキュリティの詳細設定] ダイアログ ボックスで、[監査] タブ 選択し、[ 続行] を選択します。
  4. 新しい監査規則を追加するには、[追加] を選択 します。 [ 監査エントリ ] ダイアログでプリンシパルを選択し、追加するユーザーまたはグループの名前を入力します ([すべてのユーザー])、[ OK] の順に選択します。
  5. [ 種類] で、[ 成功 ] が選択されていることを確認します。
  6. [ Show advance permissions>Clear all>Traverse folder/ execute file>OK を選択します。
  7. これで、選択した内容と一致する新しい行が 監査 エントリに表示されます。 [OK] を選択.
  8. [ プロパティ ] ダイアログで、[ OK] を選択します

これで、ファイルに対して監査規則が有効になりました。

監査ログを手動で確認する

NTFS ファイル監査では、監査アクセス許可を含み、プロセスによって アクセスされるファイルごとに、"イベント 4663: オブジェクトへのアクセスが試行されました" が生成されます。

  1. Windows + Rを押してイベント ビューアーを開き、[実行] ダイアログを開きます。 次に、「 eventvwr.msc」と入力し、 Enter キーを押します。
  2. Windows ログ>Security を展開して、イベント ビューアーセキュリティ ログに移動します。 結果ウィンドウには、セキュリティ イベントが一覧表示されます。
  3. [操作] ウィンドウで [現在のログのフィルター] を選択して、監査イベントを見つけます。 [イベント ID を含める/除外する] テキスト ボックスに「4663」と入力して、イベントをイベント ID 4663(ファイル システム カテゴリの監査成功) に絞り込みます。

ファイル アクセス監査イベント 4663 の例については、「4663(S): オブジェクトへのアクセスが試行されました」を参照してください。

PowerShell を使用して VC ランタイムの使用状況を監査する

概要として、PowerShell を使用してファイル監査のアクセス許可を更新するには、次の手順に従います。

  1. ファイルに適用する ファイル システム監査規則 を定義します。
  2. Get-Aclを使用してファイルのセキュリティ記述子を取得します。
  3. セキュリティ記述子に監査規則を適用 します。
  4. Set-Aclを使用して、更新されたセキュリティ記述子を元のファイルに適用します。
  5. 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 には、過去 24 時間のすべての監査イベント 4663 レコードを一覧表示する次の PowerShell コードに示すように、さまざまなイベント ログのイベント レコードを取得する Get-WinEvent が用意されています。

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++ 再頒布可能ライブラリとランタイム ライブラリに関する FAQ |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++ ダウンロード
ライフサイクルに関する FAQ - Visual C++ 再頒布可能パッケージとランタイム ライブラリ
Visual Studio バージョン間の C++ バイナリの互換性