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

Archive for Ноябрь 2016

В серверных операционных системах Microsoft по умолчанию отсутствует служба WebClient. Данный функционал включается установкой дополнительного компонента, который зависит от версии OS.

Windows Server 2008 R2*,2012,2012 R2 (компонент Desktop-Experience)**:

  Install-WindowsFeature Desktop-Experience

* Для Windows Server 2008 R2 командлет   Install-WindowsFeature отсутствует, вместо него используйте Add-WindowsFeature .

de211116

Windows Server 2016(компонент WebDAV-Redirector)**:

Install-WindowsFeature WebDAV-Redirector –Restart
wd211116

** Требуется обязательная перезагрузка

В систему добавляется две новые службы(WebClient&MRxDAV):

s211116 

Настройка службы WebClient производится через реестр. Подробнее про параметры, можно прочитать —  WebDAV Redirector Registry Settings

Основной параметр BasicAuthLevel имеет значение:

  • 0 — Basic authentication disabled
  • 1 — Basic authentication enabled for SSL shares only
  • 2 or greater — Basic authentication enabled for SSL shares and for non-SSL shares

В более младших версиях, параметр по умолчанию: 2

reg211116

 

Для проверки работы:

nd211116

 

Реклама

Read Full Post »

Рассмотрим, как изменить расширенное свойство файлов на примере Comments.

ep10112016

Для получения свойств, можно воспользоваться Com-классом Shell.Application. Подробнее — Retrieving Extended File Properties

# Отобразить расширенные свойства            
$folder = "С:\files"            
$file = "Document"            
$shell = New-Object -ComObject Shell.Application            
$ns = $shell.NameSpace($folder)            
$fn = $ns.Items()| Where {$_.Name -eq $file}            
            
0..60 | Select-Object @{n="Name";e={$ns.GetDetailsOf($ns,$_)}},            
    @{n="Value";e={$ns.GetDetailsOf($fn,$_)}}

Выведем отдельное свойство Comments:

sp101116

Для изменения расширенных свойств Shell.Application не подходит, воспользуемся другими методами.

1.  Office.Application

Разберем на примере Word.Application для других классов отличия лишь в имени класса.

Param(            
 $Path  = "D:\mydoc.docx",            
 $PropertyName  = "Comments",            
 $Value = "$(Get-Date): $env:COMPUTERNAME - $env:USERNAME",            
 [switch]$Show            
)            
            
# Создаем экземпляр класса            
$App = New-Object -ComObject word.application            
$App.Visible = $false            
$Document = $App.Documents.Open($Path)            
$BuiltIn = $Document.BuiltInDocumentProperties             
            
# Список свойств            
$Property = @(             
 @{n="Name";e={$_.GetType().InvokeMember("Name", "GetProperty",$null,$_,$null)}},             
 @{n="Value";e={$_.GetType().InvokeMember("Value", "GetProperty",$null,$_,$null)}}            
)            
            
if($Show)            
{            
 $BuiltIn | Select-Object -Property $Property | Out-Default            
}            
else             
{            
 # Свойство            
 $PP = $BuiltIn.GetType().InvokeMember("Item", "GetProperty",$null,$BuiltIn,$PropertyName)              
 $PP | Select-Object -Property $Property | Out-Default            
            
 # Изменим свойство            
 $PP.GetType().InvokeMember("Value", "SetProperty",$null,$PP,$Value)            
            
 $PP = $BuiltIn.GetType().InvokeMember("Item", "GetProperty",$null,$BuiltIn,$PropertyName)              
 $PP | Select-Object -Property $Property | Out-Default            
             
    # Сохраняем            
 $Document.Saved = $false            
 $Document.Save()            
}            
            
# Освобождаем ресурсы            
$App.Quit()            
[Runtime.InteropServices.Marshal]::ReleaseComObject($App) | Out-Null            
$App = $null            
[GC]::Collect()            
[GC]::WaitForPendingFinalizers()

Для получения свойств, параметр Show:

wep101116

Для изменения Comments:

wcc101116

2. Библиотека Dsofile.dll

Скачаем и установим библиотеку – https://www.microsoft.com/en-us/download/confirmation.aspx?id=8422.

Зарегистрируем библиотеку:

regsvr32 "C:\Program Files (x86)\DsoFile\dsofile.dll"

reg101116

Если система у Вас x-64, то запустите x-86 версию PowerShell.

Add-Type -Path "C:\Program Files (x86)\DsoFile\Demo\Interop.Dsofile.dll"            
$file = "D:\mydoc.docx"            
$op = New-Object DsoFile.OleDocumentPropertiesClass            
# Режим редактирования            
$op.Open($file,$false)            
            
# Получение свойств            
$op.SummaryProperties            
            
# Комментарий            
$op.SummaryProperties.Comments            
            
# Изменим комментарий            
$op.SummaryProperties.Comments = Get-Date            
            
# Сохраняем            
$op.Save()            

3.  OpenXmlSDK

Скачиваем и устанавливаем — https://www.microsoft.com/en-us/download/details.aspx?id=30425

Add-Type -Path "C:\Program Files (x86)\Open XML SDK\V2.5\lib\DocumentFormat.OpenXml.dll"            
$file = "D:\mydoc.docx"            
$file = [DocumentFormat.OpenXml.Packaging.WordprocessingDocument]::Open($file,$true)            
$file.PackageProperties.Description = Get-Date            
$file.Close()            

4. WindowsAPICodePack

Для работы с PackageManagement есть хорошая документация с подробными примерами — https://msdn.microsoft.com/ru-ru/powershell/wmf/5.0/oneget_cmdlets

# Найдем пакеты для установки            
$package = "WindowsAPICodePack-Shell","WindowsAPICodePack-Core"            
Find-Package -Name $package -Provider NuGet -Source http://www.nuget.org/api/v2            
            
pk101116
# Установим            
$package = "WindowsAPICodePack-Shell","WindowsAPICodePack-Core"            
Find-Package -Name $package -Provider NuGet -Source http://www.nuget.org/api/v2 | Install-Package            
            
# Проверим установку            
Get-Package $package | Format-List Name,Source            

gp101116

Внесем изменения в Comments:
Add-Type -Path "C:\Program Files\NuGet\Packages\WindowsAPICodePack-Core.1.1.2\lib\Microsoft.WindowsAPICodePack.dll"            
Add-Type -Path "C:\Program Files\NuGet\Packages\WindowsAPICodePack-Shell.1.1.1\lib\Microsoft.WindowsAPICodePack.Shell.dll"            
            
$file = "D:\mydoc.docx"            
$sh = [Microsoft.WindowsAPICodePack.Shell.ShellFile]::FromFilePath($file)                       
$sh.Properties.System.Comment.Value = Get-Date

Read Full Post »

Задача: Получить адрес клиента, который подключается через VPN к RRAS серверу с помощью PowerShell.

В нашей лабе:

  1. SRV-DC01  — Контроллер домена (ОС 2012+) с роль шлюза Windows PowerShell Web Access
  2. SRV-VPN    — Сервер с ролью RRAS (ОС 2012+)
  3. W10-CL1   — Клиент (ОС 2012+)

Пример схемы:

Windows PowerShell Web Access diagram

1. Установка  Windows PowerShell Web Access

Данная процедура подробно описана в Install and Use Windows PowerShell Web Access ,

поэтому лишь выполним основные действия на SRV-DC01.

# Установка роли            
Install-WindowsFeature –Name WindowsPowerShellWebAccess -IncludeManagementTools -Restart            
            
# После перезагрузки            
# Установка и настройка web приложения с self-signed сертификатом(            
# рекомендуется использовать только в тестовых средах)            
# Path: /pswa            
# ApplicationPool: pswa_pool            
# EnabledProtocols: http            
# PhysicalPath: %windir%/Web/PowerShellWebAccess/wwwroot            
            
Install-PswaWebApplicationUseTestCertificate
ipswa08112016

Осталось добавить только правила доступа для PSWA. Лучше создавать правила для групп, а не отдельных пользователей.

Для нашего примера, создадим группу helpdesk_vpn в которую будет входить пользователь contoso\user1.

# Создадим группу            
New-ADGroup -Name helpdesk_vpn -GroupCategory Security -GroupScope Universal            
            
# Добавим пользователя в нее            
Add-ADGroupMember -Identity helpdesk_vpn -Members User1

После создания группы, создадим правило для доступа с параметрами: подключение ведется к SRV-VPN, кому разрешено contoso\helpdesk, constrained endpoints с именем VPN.

# Правило доступа                      
$param = @{            
    RuleName              = "Helpdesk VPN"             
    UserGroupName    = "contoso\helpdesk_vpn"             
    ComputerName      =  "srv-vpn"            
    ConfigurationName = "VPN"            
    Force                     = $true            
}            
            
Add-PswaAuthorizationRule @param            

PS > Add-PswaAuthorizationRule @param

Id    RuleName         User

—    ———         —-

0     Helpdesk VPN     contoso\helpdesk_vpn

2. Перейдем к созданию constrained endpoints на сервере SRV-VPN

Требуемый функция Get-RemoteAccessConnectionStatistics находится в модуле RemoteAccess.

В этом можно убедиться:

grac08112016 

Т.к. у helpdesk_vpn права на выполнения данного функции — нет, то нужно  создать отдельный аккаунт от которого будет запускаться функция или добавить пользователя в группу у которой есть право на выполнение(например Администраторы). Начиная с PowerShell v5+  у командлета

New-PSSessionConfigurationFile появился параметр  -RunAsVirtualAccount , позволяя обойтись без создания дополнительных групп и пользователей. Т.к. данный аккаунт по умолчанию входит в локальную группу Администраторов в ОС начиная с 2008 R2. При конфигурировании надо быть очень осторожным, т.к. неверное конфигурирования даст пользователю возможность запускать команды от более привилегированного пользователя.

PSv5+: 
# Создание constrained endpoints            
# Данные командлеты требуются, если пользовать захочит сделать Enter-PsSession            
$Cmdlets = @(            
    'Get-Command', 'Out-Default',            
    'Exit-PSSession', 'Measure-Object',            
    'Select-Object' , 'Get-FormatData'            
)            
 
# Параметры                        
$param = @{                        
    Path                          = ".\VisibleCmdlets.pssc"                        
    VisibleCmdlets          = $Cmdlets                        
    VisibleFunctions        = "RemoteAccess\Get-RemoteAccessConnectionStatistics"            
    SessionType              = "RestrictedRemoteServer"                           
    LanguageMode          = "NoLanguage"                        
    RunAsVirtualAccount = $true                                   
}

# Конфигурирование и назначение прав
New-PSSessionConfigurationFile  @param
Register-PSSessionConfiguration -Path .\VisibleCmdlets.pssc -Name VPN -Force
Get-PSSessionConfiguration VPN | Set-PSSessionConfiguration -ShowSecurityDescriptorUI

Для PSv4+:

Тут указываем учетную запись обладающую правами локального администратора

(отвечает параметр -RunAsCredential «Contoso\Administrator») .

# Создание constrained endpoints            
# Данные командлеты требуются, если пользовать захочит сделать Enter-PsSession            
$Cmdlets = @(            
    'Get-Command', 'Out-Default',            
    'Exit-PSSession', 'Measure-Object',            
    'Select-Object' , 'Get-FormatData'            
)            
            
# Параметры            
$param = @{            
    Path = ".\VisibleCmdlets.pssc"            
    VisibleCmdlets = $Cmdlets            
    VisibleFunctions = "Get-RemoteAccessConnectionStatistics"            
    ModulesToImport = "RemoteAccess"            
}            
            
# Конфигурирование и назначение права            
New-PSSessionConfigurationFile  @param            
Register-PSSessionConfiguration -Path .\VisibleCmdlets.pssc -Name VPN -RunAsCredential "Contoso\Administrator" -Force            
Get-PSSessionConfiguration VPN | Set-PSSessionConfiguration -ShowSecurityDescriptorUI            

perm08112016

Если все прошло без ошибок, то у Вас должно быть примерно следущее:

gpc08112016

3. Осталось сделать тест и убедиться, что все отрабатывает хорошо.

Переходим по адресу https://mypswa.ru/pswa и заполняем поля

User Name, Password, Computer Name,Configuration name и нажимаем Sign In.

pswa08112016

Выполняем функцию:

pswac08112016

Доступные нам команды в сессии:

comm08112016

 

Read Full Post »