По умолчанию в Windows нет консольного приложения для управления ABE. Более подробно про ABE,можно узнать в блоге Алексея Горбунова и ABE Graphical User Interface , во второй ссылке подробно рассказывается, какие API используются для управления ABE.
Утилита командной строки для управления ABE(более подробно смотри во второй ссылке):
ABECMD — http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=17510
В статье про “управление кэшированием общих папок”, весь функционал скрипта уже был реализован, поэтому достаточно было добавить только флаг FLAGS_ACCESS_BASED_DIRECTORY_ENUM, который равняется 0x0800.
$code = @" public enum CacheType { Manual = 0x00, Documents = 0x10, Programs = 0x20, None = 0x30, } public const int FLAGS_ACCESS_BASED_DIRECTORY_ENUM = 0x0800; [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-ShareABE { 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) { $Enable = "Disabled" $str1005 = [System.Runtime.InteropServices.Marshal]::PtrToStructure($bufptr,[Share+SHARE_INFO_1005]) $value = $str1005.shi1005_flags if ($value -band [Share]::FLAGS_ACCESS_BASED_DIRECTORY_ENUM) { $Enable = "Enabled" } Get-WmiObject Win32_Share -Filter "Name='$ShareName'" | Select-Object Name,` Path,Description,@{n="ABE";e={$Enable}},@{n="Flag";e={$value}} } else { Write-Host (net helpmsg $return) } [Share]::NetApiBufferFree($bufptr) | Out-Null } } function Set-ShareABE { param( [parameter(Mandatory=$true,Position=0)] [string]$ShareName, [parameter(Mandatory=$true,Position=1)] [ValidateSet("Enable", "Disable")] [string]$Type ) $paramerror = 0 if ($Type -eq "Disable") { $flag = (Get-ShareABE -ShareName $ShareName).Flag -bxor [Share]::FLAGS_ACCESS_BASED_DIRECTORY_ENUM } else { $flag = [Share]::FLAGS_ACCESS_BASED_DIRECTORY_ENUM } $buf = New-Object Share+SHARE_INFO_1005 -Property @{shi1005_flags = $flag} $return = [Share]::NetShareSetInfo($null,$ShareName,1005,[ref]$buf,[ref]$paramerror) if ($return) { Write-Host (net helpmsg $return) } }
Применение функции Get-ShareABE:
PS > Get-ShareABE doesnotexists This shared resource does not exist. PS > Get-ShareABE Test Name : TEST Path : C:\TEST Description : ABE : Disabled Flag : 0 PS > Get-WmiObject Win32_Share | Get-ShareABE Name : ADMIN$ Path : C:\Windows Description : Remote Admin ABE : Disabled Flag : 0 Name : C$ Path : C:\ Description : Default share ABE : Disabled Flag : 0 Name : IPC$ Path : Description : Remote IPC ABE : Disabled Flag : 0 Name : TEST Path : C:\TEST Description : ABE : Disabled Flag : 0
Применение функции Set-ShareABE:
PS > Get-ShareABE Test Name : TEST Path : C:\TEST Description : ABE : Disabled Flag : 0 PS > Set-ShareABE Test -Type Enable PS > Get-ShareABE Test Name : TEST Path : C:\TEST Description : ABE : Enabled Flag : 2048 PS > Set-ShareABE Test -Type Disable PS > Get-ShareABE Test Name : TEST Path : C:\TEST Description : ABE : Disabled Flag : 0
О! Отличный пост. Как раз размышляю над реорганизацией нашего файлохранилища
Thank you very much for this blog post. I used parts of this code for my PowerShell Module FileShareUtils here: https://github.com/CamFlyerCH/FileShareUtils