Feeds:
Записи
Комментарии

Archive for Ноябрь 2011

Управление процессом кэширования для общих папок с помощью 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
Реклама

Read Full Post »