Condividi tramite


Come controllare l'utilizzo della versione del runtime di Visual C++

Microsoft Visual C++ Redistributable e Il runtime di Visual Studio C++ (collettivamente "VC Runtime") sono componenti critici di molte applicazioni. Nella tua rete, i computer potrebbero ancora eseguire applicazioni che installano e usano una versione non supportata di VC Runtime. È possibile usare il controllo dei file NTFS per identificare tale utilizzo, ad esempio un passaggio per sostituire le applicazioni con quelle che usano una versione supportata del runtime VC. Questa guida illustra come configurare il controllo dei file NTFS, fornisce suggerimenti per la risoluzione dei problemi ed evidenzia i vantaggi dei controlli regolari.

Per ulteriori informazioni sulle versioni di VC Runtime non più supportate, consultare gli ultimi download supportati di Microsoft Visual C++ Redistributable.

Abilitare il controllo dei file NTFS per determinare l'utilizzo di VC Runtime

Questa guida illustra la procedura per abilitare manualmente il controllo dei file NTFS ed esaminare gli eventi di controllo per determinare quali applicazioni chiamano le versioni non supportate di VC Runtime. Poiché sono disponibili diversi file che possono essere usati da un'applicazione, questa guida illustra anche come usare i cmdlet di Get-Acl e Set-Acl di PowerShell per aggiornare le autorizzazioni di controllo. Per altre informazioni su come configurare i criteri di controllo per un file, vedere Applicare criteri di controllo di base in un file o una cartella.

Abilitare manualmente il controllo dell'accesso agli oggetti nel sistema

L'accesso agli oggetti deve essere abilitato prima di abilitare il controllo a livello di file:

  1. Apri Editor Criteri di gruppo locali premendo Windows + R per aprire la finestra di dialogo Esegui. Digitare quindi gpedit.msc e premere INVIO.
  2. Passare a Configurazione computer >Impostazioni di Windows>Impostazioni di sicurezza>Configurazione avanzata dei criteri di controllo>Criteri di controllo del sistema>Accesso agli oggetti.
  3. Fare doppio clic su Audit File System. Nella finestra di dialogo proprietà del file system di controllo selezionare Configurare gli eventi di controllo seguenti>Operazione riuscita>OK.
  4. Chiudere Editor Criteri di gruppo locali.

In alternativa, è possibile usare auditpol.exe per abilitare l'accesso agli oggetti:

  1. Elencare le impostazioni correnti dalla riga di comando con AuditPol.exe /get /category:"Object Access".
  2. Abilitare l'accesso agli oggetti con AuditPol.exe /set /category:"Object Access" /subcategory:"File System" /success:enable.

Abilitare manualmente il controllo in un file

Per monitorare il processo che accede a un file di runtime VC, abilitare il controllo nel file di runtime VC:

  1. Fare clic con il pulsante destro del mouse sul file che si desidera controllare, selezionare Proprietàe quindi selezionare la scheda Sicurezza. Per ulteriori informazioni su come trovare i file VC Runtime installati, vedere percorsi installati di VC Runtime.
  2. Selezionare Avanzato.
  3. Nella finestra di dialogo Impostazioni di sicurezza avanzate, selezionare la scheda Verifica e quindi selezionare Continua.
  4. Per aggiungere una nuova regola di controllo, selezionare Aggiungi. Nella finestra di dialogo Voce di controllo, selezionare un principale, quindi inserire il nome dell'utente o del gruppo da aggiungere, ad esempio (Tutti), e quindi selezionare OK.
  5. In Tiposelezionare assicurarsi che sia selezionato Operazione riuscita.
  6. Selezionare Mostra autorizzazioni avanzate>Cancella tutto>Attraversa cartella / esegui file>OK.
  7. Dovrebbe ora essere presente una nuova riga nella revisione delle voci che corrispondono a quanto hai selezionato. Selezionare OK.
  8. Nella finestra di dialogo Proprietà , selezionare OK.

La regola di controllo è ora abilitata per il file.

Esaminare manualmente i log di controllo

Il controllo dei file NTFS genera "Evento 4663: è stato effettuato un tentativo di accesso a un oggetto" per ogni file che include l'autorizzazione di controllo ed è accessibile da un processo.

  1. Aprire il Visualizzatore eventi premendo Windows + R per aprire la finestra di dialogo Esegui. Digitare quindi eventvwr.msce premere INVIO.
  2. Passare ai log di sicurezza nel visualizzatore eventi espandendo Log di Windows>sicurezza . Nel riquadro dei risultati sono elencati gli eventi di sicurezza.
  3. Trova gli eventi di controllo scegliendo Filtra log corrente... nel riquadro Azioni. Restringere gli eventi a ID evento 4663 (Verifica riuscita per la categoria del file system) immettendo 4663 nella casella di testo Includi/Escludi ID eventi.

Per un esempio di evento di controllo dell'accesso ai file 4663, vedere "4663(S): Tentativo di accesso a un oggetto."

Usare PowerShell per controllare l'utilizzo di VC Runtime

Per una panoramica, l'aggiornamento delle autorizzazioni di controllo dei file con PowerShell segue questa procedura:

  1. Definire la regola di controllo del file system da applicare ai file.
  2. Ottenere il descrittore di sicurezza di un file con Get-Acl.
  3. Applicare la regola di controllo al descrittore di sicurezza.
  4. Applicare il descrittore di sicurezza aggiornato nel file originale con Set-Acl.
  5. Visualizza i record dell'evento di controllo dell'accesso ai file 4663 con Get-WinEvent.

PowerShell: Controllare i file di runtime VC non supportati

Il codice di PowerShell seguente consente di controllare i file di runtime VC installati che non sono più supportati.

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: visualizzare gli eventi di controllo dei file

PowerShell fornisce Get-WinEvent per ottenere i record degli eventi per vari registri eventi, come illustrato nel codice di PowerShell seguente che elenca tutti i record dell'evento di controllo 4663 nelle ultime 24 ore:

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

Passaggi successivi dopo il controllo dell'utilizzo di VC Runtime

Dopo aver determinato quali processi usano i file di runtime VC o quali applicazioni hanno installato VC Redistributable, disinstallare tali applicazioni o aggiornarle a versioni più recenti che non dipendono da runtime VC non supportati.

Alcune applicazioni Microsoft richiedono versioni legacy di VC Runtime. Per informazioni dettagliate, vedere Domande frequenti sulle librerie ridistribuibili e di runtime di Visual C++ | Microsoft Learn.

Percorsi di installazione di VC Runtime

Ecco dove è installata ogni versione del runtime vc:

Versione di Visual Studio Posizione(e) installata(e)
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

Vedere anche

ridistribuzione dei file di Visual C++
Download supportati più recenti di Visual C++
Domande frequenti sul ciclo di vita di - Librerie ridistribuibili e di runtime di Visual C++
compatibilità binaria C++ tra le versioni di Visual Studio