Управление процессом кэширования для общих папок с помощью PowerShell
Был задан вопрос: ”Как управлять процессом кэширования с помощью PowerShell?”. Для управления кэшированием в Windows, существует встроенная утилита net,у которой есть ключ /cache. Данный ключ принимает следующие параметры:
PS > net share /? [/CACHE:Manual | Documents | Programs | BranchCache | None]
Для просмотра состояния кэширования для общей папки, можно воспользоваться, следующим синтаксисом:
Syntax: net share sharename PS > net share C$ Share name C$ Path C:\ Remark Стандартный общий ресурс Maximum users No limit Users Caching Manual caching of documents Permission Все, FULL The command completed successfully.
На мой взгляд, утилита net,предоставляет простой и удобный способ управления – параметром кэширования. И именно его предпочтительней использовать в своих скриптах.
Попробуем реализовать данный функционал, используя стандартные WinApi функции. Для этого нам потребуется две функции и одна структура:
1) NetShareGetInfo – для получения состояние кэширования;
2) NetShareSetInfo – для установки параметра кэширования;
3) _SHARE_INFO_1005– содержит информацию о кэшировании;
Структура _SHARE_INFO_1005 , поддерживает большое количество битовых флагов, но нам потребуется только флаг CSC_MASK, более подробно смотрите по ссылке выше. Определение данных функций для C#,можно посмотреть на сайте – Pinvoke.
$code = @" public enum CacheType { Manual = 0x00, Documents = 0x10, Programs = 0x20, None = 0x30, } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] public struct SHARE_INFO_1005 { public uint shi1005_flags; } [DllImport("Netapi32", CharSet=CharSet.Auto)] public static extern int NetApiBufferFree(IntPtr Buffer); [DllImport("Netapi32.dll", SetLastError=true)] public static extern int NetShareGetInfo( [MarshalAs(UnmanagedType.LPWStr)] string serverName, [MarshalAs(UnmanagedType.LPWStr)] string netName, Int32 level, out IntPtr bufPtr ); [DllImport("Netapi32.dll", CharSet = CharSet.Unicode)] public static extern uint NetShareSetInfo(string servername, string netname, uint level, ref SHARE_INFO_1005 buf, out uint paramerror); "@ Add-Type -MemberDefinition $code -name Share -namespace System function Get-ShareCache { param( [parameter(Mandatory=$true,ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)] [Alias("Name")] [string]$ShareName ) process { $bufptr = [IntPtr]::Zero $return = [Share]::NetShareGetInfo($null,$ShareName,1005,[ref]$bufptr) if($return -eq 0) { $str1005 = [System.Runtime.InteropServices.Marshal]::PtrToStructure($bufptr,[Share+SHARE_INFO_1005]) $value = $str1005.shi1005_flags Get-WmiObject Win32_Share -Filter "Name='$ShareName'" | Select-Object Name,` Path,Description,@{n="Caching";e={ 1,2,256,512,1024,2048,4096 | Foreach { if ($value -band $_) { $value -= $_ } } $value -as [Share+CacheType]}} } else { Write-Host (net helpmsg $return) } [Share]::NetApiBufferFree($bufptr) | Out-Null } } function Set-ShareCache { param( [parameter(Mandatory=$true,Position=0)] [string]$ShareName, [parameter(Mandatory=$true,Position=1)] [ValidateSet("Manual", "Documents", "Programs","None")] [string]$CacheType ) $paramerror = 0 $buf = New-Object Share+SHARE_INFO_1005 -Property @{shi1005_flags = [Share+CacheType]::$CacheType} $return = [Share]::NetShareSetInfo($null,$ShareName,1005,[ref]$buf,[ref]$paramerror) if ($return) { Write-Host (net helpmsg $return) } }
Использование.
Применение функции Get-ShareCache:
PS > Get-ShareCache doesnotexists This shared resource does not exist. PS > Get-ShareCache C$ | Format-Table -Auto Name Path Description Caching ---- ---- ----------- ------- C$ C:\ Стандартный общий ресурс Manual PS > Get-WmiObject Win32_Share | Get-ShareCache | Format-Table -Auto Name Path Description Caching ---- ---- ----------- ------- ADMIN$ C:\Windows Удаленный Admin Manual C$ C:\ Стандартный общий ресурс Manual IPC$ Удаленный IPC Manual print$ C:\Windows\system32\spool\drivers Драйверы принтеров Manual
Применение функции Set-ShareCache:
PS > Get-ShareCache test | Format-Table -Auto Name Path Description Caching ---- ---- ----------- ------- Test C:\Test Manual PS > Set-ShareCache -ShareName Test -CacheType Documents PS > Get-ShareCache test | Format-Table -Auto Name Path Description Caching ---- ---- ----------- ------- Test C:\Test Documents PS > Set-ShareCache -ShareName Test -CacheType Programs PS > "Test" | Get-ShareCache | Format-Table -Auto Name Path Description Caching ---- ---- ----------- ------- Test C:\Test Programs
[…] статье про “управление кэшированием общих папок”, весь функционал скрипта уже был реализован, поэтому […]