Авторизация



Теги сайта



0х0000007b 1c access control list acl activation active directory ad roles add route adexplorer apache authentication to zabbix bare metal recovery bg zsh bicycle books bruteforce ccna centos centos packet certificate change net adapter name chap chkrootkit chmod cinnamon cisco class clipboard cmd configuring cpu cores cron crontab csc custom object cut cvsup cvsup-without-gui db dekorator dev null 2 1 dhcp dhcp reservation disable ipv6 diskpart dism django dns domain naming master domain roles download download powershell enable routing on windows enabled encapsulation english english language esx eventlog fail2ban fastest_cvsup fedora fg zsh field formatdatabase freebsd fsmo get-aduser hardware https hyper-v idioms iis inheritance iperf iptables iscsi jobs kernel panic ldap ldap аутентификация zabbix limit lingualeo linux mcitp mcsa memory check method microsoft mod_ssl mount mssql mysql mysql user password netcache network network config network load balance cluster network scripts nginx nlb num lock numlock oop openssl pap partition pdc permissions pfx php pipeline pkg_version polymorphism ports upgrade portupgrade posix powershell ppp puppet pwdlastset python rdp regedit registry remote enable restrictions reverse proxy rhel rid rope jumping bridge мост прыжок высота route add route freebsd routing protocol rpm sc sc sdset sc sdshow schema scope script output secure web security service permissions services session set dns servers set ip address sftp shell script show variables snmp sound scheme sounds speed ssh ssl standard-supfile subinacl supfile switch switchport sync syncronization task sсheduler tempdb tripplite monitoring tweaks unix user must change password at next logon utf8 vim vlan vmware w32tm web windows windows 2003 r2 windows 2008 r2 windows firewall windows server windows server 2012 windows server backup windows service permissions windows пингалка winre wsus xargs xrdp yum zabbix zabbix external check zabbix ldap authentication zsh автоматическое обновление портов freebsd автономные файлы активация английский язык база данных безопасность active directory буфер вело велосипед видео включение роутинга в windows внешняя проверка zabbix вредоносное программное обеспечение posix задание двумерного массива звуки звуковая схема идиомы иероглифы киев кодировка командная строка конфигурация сети маршрутизация маршруты в freebsd маршруты в redhat linux область обновление портов ограничения windows основные команды пакеты centos перевод перенос планировщик задач покатушки полет над днепром проблемы кодировки протокол путь развития в it разрешения служб windows регистрируем cmd скриптом недоступность хоста реестр резервирование ip скриптом роли домена русские символы синхронизация скачать скачать powershell скачать книгу скорость сети списки контроля доступа тарзанка твики фоновые процессы цикл mssql

Главная страница Microsoft POWERSHELL
Задать ACL для HV Extensible Switch в Windows Server 2012 R2 Печать
Get-VMNetworkAdapterExtendedAcl -VMName "MyVirtualMachine1"

Add-VMNetworkAdapterExtendedAcl -VMName "MyVirtualMachine1" -Action "Deny" -Direction "Outbound" -Weight 1
Add-VMNetworkAdapterExtendedAcl -VMName "MyVirtualMachine1" -Action "Deny" -Direction "Inbound" -Weight 1
Add-VMNetworkAdapterExtendedAcl -VMName "MyVirtualMachine1" -Action "Allow" -Direction "Outbound" -RemoteIPAddress 10.0.1.0/24 -RemotePort 67 -Protocol "UDP" -Weight 10
Add-VMNetworkAdapterExtendedAcl -VMName "MyVirtualMachine1" -Action "Allow" -Direction "Inbound" -RemoteIPAddress 10.0.1.0/24 -RemotePort 68 -Protocol "UDP" -Weight 10

Remove-VMNetworkAdapterExtendedAcl -VMName "MyVirtualMachine1" -Direction "Inbound" -Weight 1
Remove-VMNetworkAdapterExtendedAcl -VMName "MyVirtualMachine1" -Direction "Inbound" -Weight 10
Remove-VMNetworkAdapterExtendedAcl -VMName "MyVirtualMachine1" -Direction "Outbound" -Weight 1
Remove-VMNetworkAdapterExtendedAcl -VMName "MyVirtualMachine1" -Direction "Outbound" -Weight 10
 
Скрипт PowerShell для установки сложных паролей списку пользователей AD Печать

Скрипт Set-ADAccountStaticComplexPassword позволяющий устанавливать пользователям в Active Directory сложные пароли.

Скрипт PowerShell, позволяющий:

  • Получить список логинов пользователей Active Directory из текстового файла, массива или по конвейеру для последующей обработки
  • Установить каждому пользователю из списка сгенерированный сложный пароль от 7 до 8 символов, не требующий периодического изменения
  • Установить каждому пользователю из списка запрет на самостоятельное изменение пароля
  • Снять с каждого пользователя из списка необходимость изменить пароль при первом входе в систему
  • Вывести соответствующие логины и присвоенные им пароли в текстовый файл либо на экран

 

Как им пользоваться:

PS C:\> Get-Help Set-ADAccountStaticComplexPassword -Examples

Function Global:Set-ADAccountStaticComplexPassword ([parameter(Position=0, Mandatory=$false, ValueFromPipeline=$true)][System.Array]$SourceSamAccountNameArray,
                                                    [parameter(Mandatory=$false)][string]$SourceSamAccountNameListFromFile,
                                                    [parameter(Mandatory=$false)][string]$DestinationList,
                                                    [parameter(Mandatory=$false)]$Server,
                                                    [parameter(Mandatory=$false)]$Credential)
{

<#
    .SYNOPSIS
    Set complex password to AD accounts, which users can not change.

    .DESCRIPTION
    This function sets options (Password Never Expires, User Can Not Change Password, User Needn't Change Password At First Logon) to each AD account from either of file SourceSamAccountNameListFromFile or Array. Besides it specifies complex password for appropriate AD account.   Original and comments:  http://vam.in.ua/index.php/it/25-ms-powershell/209-powershell-ad-account-complex-password.html   Feedback:  http://vam.in.ua/index.php/contacts/2-admins/1-aleksey.html

    .PARAMETER SourceSamAccountNameArray
    Specify "System Array" with list of AD accounts. You can also use it over pipeline. It is necessary if you aren't going to specify "SourceSamAccountNameListFromFile" parameter.

    .PARAMETER SourceSamAccountNameListFromFile
    Set path to file with list of AD accounts. It is necessary if you haven't specified "SourceSamAccountNameArray" parameter.

    .PARAMETER DestinationList
    Set path to file in which function puts result.

    .PARAMETER Server
    You can specify certain domain controller for processing.

    .PARAMETER Credential
    You can specify certain credentials for processing.

    .EXAMPLE
    PS C:\> Set-ADAccountStaticComplexPassword -SourceSamAccountNameListFromFile C:\WorkDir\accounts.txt

    .EXAMPLE
    PS C:\> Set-ADAccountStaticComplexPassword -SourceSamAccountNameListFromFile C:\WorkDir\accounts.txt -DestinationList C:\WorkDir\result.txt -Server DC1.domain.local -Credential domain\administrator

    .EXAMPLE
    PS C:\> $users = @("User01","User02","User03")
    PS C:\> Set-ADAccountStaticComplexPassword -SourceSamAccountNameArray $users
    
    .EXAMPLE
    PS C:\> $users = @("User01","User02","User03")
    PS C:\> $users | Set-ADAccountStaticComplexPassword -Server DC1.domain.local -Credential domain\administrator

    .EXAMPLE
    PS C:\> Get-ADUser -Filter {name -like 'User0*'} | Set-ADAccountStaticComplexPassword

    .EXAMPLE
    PS C:\> Get-ADUser -Filter * -Properties whenCreated | where {$_.whenCreated -gt (Get-Date).AddDays(-1)} | Set-ADAccountStaticComplexPassword
#>

    
    if ($input) # Если существует переменная input (в неё заносится ввод через конвейер, если таковой имел место)
    {
        $SourceSamAccountNameArray = $input
    }

    if (($SourceSamAccountNameArray) -and ($SourceSamAccountNameListFromFile)) # Если указаны сразу оба способа передачи входных данных в командлет
    {
        Write-Error -Message "You have specified both source parameters for input. Please specify only one certain source parameter either of SourceSamAccountNameArray or SourceSamAccountNameListFromFile" -RecommendedAction "Specify one certain source parameter either of SourceSamAccountNameArray or SourceSamAccountNameListFromFile" 
        Break
    }
    
    if ((!$SourceSamAccountNameArray) -and (!$SourceSamAccountNameListFromFile)) # Если не указан ни один способ передачи входных данных в командлет
    {
        Write-Error -Message "You haven't specified any source parameter for input. Please specify one certain source parameter either of SourceSamAccountNameArray or SourceSamAccountNameListFromFile" -RecommendedAction "Specify one certain source parameter either of SourceSamAccountNameArray or SourceSamAccountNameListFromFile" 
        Break
    }

    Import-Module ActiveDirectory -ErrorAction Stop # Подключим модуль AD
    
    if ($Credential) # Если указаны учетные данные
    {
	    $script:passwd = Get-Credential -Credential $Credential -ErrorAction Stop # Занесем в переменную полученные учетные данные
	    if ((!$passwd) -or ($passwd.Length -lt 1)) {Break} 
    }

    
    if ($Server) {   # Если переменная Server не определена, то подставить ей значение текущего контроллера домена
        if ($Credential) { 
            $Server = Get-ADDomainController -Credential $passwd -Server $Server -ErrorAction Stop # Занесем в переменную указанный контроллер домена
            $Server = $Server.HostName
        } else {
            $Server = Get-ADDomainController -Server $Server -ErrorAction Stop
            $Server = $Server.HostName
        }
    } else {
        if ($Credential) {
            $Server = Get-ADDomainController -Credential $passwd -ErrorAction Stop # Занесем в переменную текущих контроллер домена
            $Server = $Server.HostName
        } else {
            $Server = Get-ADDomainController -ErrorAction Stop 
            $Server = $Server.HostName
        }
    }

    $Error.Clear | Out-Null
    Write-Host
    Write-Host 'Original and comments: http://vam.in.ua/index.php/it/25-ms-powershell/209-powershell-ad-account-complex-password.html' -ForegroundColor DarkCyan
    Write-Host 'Feedback: http://vam.in.ua/index.php/contacts/2-admins/1-aleksey.html' -ForegroundColor DarkCyan
    

    Function script:Get-RandomPassword # Генератор сложных паролей на PowerShell
    {
        <#
            .SYNOPSIS
            Get random complex password.
            
            .DESCRIPTION
            This function generate random complex password.

            .PARAMETER PasswordLength
            Set needed length of password.

            .EXAMPLE
            PS C:\> Get-RandomPassword 8

            .EXAMPLE
            PS C:\> 5..7| Get-RandomPassword
        #>

        [CmdletBinding()]   # Добавляем в командлет дополнительные возможности
        Param(
            [Parameter(Position=0, Mandatory=$true, ValueFromPipeline=$true)]
            [ValidateRange(4,15)]
            [Int]
            $PasswordLength
        )
        Begin{}
        Process{

            $numberchars=0..9 | % {$_.ToString()}
            $lochars = ([char]'a' .. [char]'k') + ([char]'m' .. [char]'n')  + ([char]'p' .. [char]'z') | % {[char]$_} # исключаем из пароля "непонятные" символы
            $hichars = ([char]'A' .. [char]'H') + ([char]'J' .. [char]'N') + ([char]'P' .. [char]'Z') | % {[char]$_}
            $punctchars = [char[]](33..38) + [char[]](40..43) + [char[]](45)

            $PasswordArray = Get-Random -InputObject @($hichars + $lochars + $numberchars + $punctchars) -Count $PasswordLength

            $char1 = Get-Random -InputObject $hichars
            $char2 = Get-Random -InputObject $lochars
            $char3 = Get-Random -InputObject $numberchars
            $char4 = Get-Random -InputObject $punctchars

            $RndIndexArray = Get-Random (0..($PasswordLength-1)) -Count 4

            $PasswordArray[$RndIndexArray[0]] = $char1
            $PasswordArray[$RndIndexArray[1]] = $char2
            $PasswordArray[$RndIndexArray[2]] = $char3
            $PasswordArray[$RndIndexArray[3]] = $char4

            Return [system.string]::Join('', $PasswordArray)

        }
        End{}
    }


    $script:accs = @() # Объявление массива

    if ($SourceSamAccountNameArray) # Если входные данные были определены через массив или по конвейеру
    {
        foreach ($specitem in $SourceSamAccountNameArray)
        {
            if ($specitem.GetType().FullName -eq "Microsoft.ActiveDirectory.Management.ADUser") # Если тип данных является dotNet "ADUser"
            {
                $accs += $specitem.SamAccountName
            }
            else
            {
                $accs += $specitem
            }
        }
    }
    else
    {
        $accs = Get-Content $SourceSamAccountNameListFromFile -ErrorAction Stop # Возьмем список учеток samaccountname из файла
    }

    Write-Host 
    Write-Host
    Write-Host

    $script:result = @() # Объявление массива

    foreach ($acc in $accs) 
    {
        $passd = Get-RandomPassword (Get-Random -Minimum 7 -Maximum 9) # Длина пароля от 7 до 8 символов

        if ($Credential) 
        {
            $ADuser = Get-ADUser -Credential $passwd -Server $Server -Identity $acc -ErrorAction Stop # Занесем в переменную текущего пользователя

            $ADuser | Set-ADUser -Credential $passwd -Server $Server -ChangePasswordAtLogon $false -CannotChangePassword $true -PasswordNeverExpires $true -ErrorAction Stop # Устанавливаем текущему пользователю параметры

            $ADuser | Set-ADAccountPassword -Credential $passwd -Server $Server -Reset -NewPassword (ConvertTo-SecureString -AsPlainText -Force ($passd)) -ErrorAction Stop # Устанавливаем текущему пользователю пароль
        }
        else
        {
            $ADuser = Get-ADUser -Server $Server -Identity $acc -ErrorAction Stop

            $ADuser | Set-ADUser -Server $Server -ChangePasswordAtLogon $false -CannotChangePassword $true -PasswordNeverExpires $true -ErrorAction Stop

            $ADuser | Set-ADAccountPassword -Server $Server -Reset -NewPassword (ConvertTo-SecureString -AsPlainText -Force ($passd)) -ErrorAction Stop
        }

        $result += $acc + "`t`t" + $passd # Собираем логины и пароли в массив через два табулятора
    }

    if ($DestinationList) # Если определен файл, в который необходимо поместить результат
    {
        Out-File -InputObject $result -FilePath $DestinationList -Width 512 -ErrorAction Stop # Куда выкладывать результат
    }
    else
    {
        Remove-Variable -Name passd, passwd, Credential, ADuser -ErrorAction SilentlyContinue
        Return $result # Выводим результат на экран
    }
    
    Remove-Variable -Name passd, passwd, Credential, ADuser, result -ErrorAction SilentlyContinue

}
 
Скрипт PowerShell для слития ролей Failover Cluster при проблеме с Team Печать

Данный скрипт перекинет все виртуальные машины с текущего узла кластера, если упадет агрегированный Team интерфейс (используется как транковый интерфейс для данных виртуальных машин). Также скрипт будет вести логирование в файл c:\DLC-TeamGroup.log и создавать файлы в корне диска C:\ которые можно использовать для других систем оповещения о проблеме.

 

<#
 This script will set current cluster node to maintance mode with drain roles if network team interface is down.
 When connection through team will restored, script resumes node from maintance mode and failbacks roles.

 You must add this script to Task Scheduler

 Original and comments: http://vam.in.ua/index.php/it/25-ms-powershell/196-powershell-scrript-to-drain-cluster-roles-if-team-interface-down.html
 Feedback: http://vam.in.ua/index.php/contacts/2-admins/1-aleksey.html
#>

Import-Module NetLbfo,FailoverClusters -ErrorAction Stop # Импортируем нужные модули

[bool]$script:EverythingOkay = $true # Задаем переменную текущего состояния
[bool]$script:TeamWasBad = $false # Задаем переменную предыдущего состояния
[bool]$script:TeamWasDegraded = $false # Задаем переменную предыдущего состояния
$script:cdtn = 0 # Задаем переменную для последующего цикла
$script:LogPath = 'c:\DLC-TeamGroup.log' # Заносим в переменную путь к лог файлу
[string]$script:TempVar = ' ' # Определяем рабочую текстовую переменную

if (!(Test-Path -Path $LogPath)) # Если не существует лога 
{
    $private:FullScriptName = $MyInvocation.MyCommand.Definition # Записываем в переменную полный путь к скрипту
    Set-Content -Path $LogPath -Force -ErrorAction Stop -Value '# ', '# Log file for Team checking script', '# Original and comments: http://vam.in.ua/index.php/it/25-ms-powershell/196-powershell-scrript-to-drain-cluster-roles-if-team-interface-down.html', '# Feedback:   http://vam.in.ua/index.php/contacts/2-admins/1-aleksey.html', "# Script path:   $FullScriptName", '# ', '# ', ' ' # Создадим лог
}

while ($cdtn -eq 0) # Т.к. переменная $cdtn будет всегда равна нулю - цикл вечный
{ 

    if ((Get-NetLbfoTeam).Status -eq 'Down') # Если тиминговая группа потеряла коннект
    {
        $TeamWasDegraded = $false # Наш Team полностью развалился, поэтому снимаем состояние Degraded
        
        if ( ($EverythingOkay -eq $true) -and ((Get-ClusterNode -Name "$env:COMPUTERNAME").State -eq 'Up') ) # Текущее состояние узла нормальное и нода не остановлена вручную
        {
            $EverythingOkay = $false # Записываем проблему в переменную 
            $TempVar = (Suspend-ClusterNode -Drain | Out-String) # Переводим хост в режим обслуживания со слитием ролей на соседнюю ноду и записываем вывод действия в переменную
            Add-Content -Path $LogPath -Value '****** ============== ******', ((Get-Date -Format "yyyy.MM.dd   HH:mm:ss" | Out-String) + "Teaming group has been DOWN"), $TempVar, " " # Добавляем запись в лог
        } else
        {
            if ($TeamWasBad -eq $false) # Если скрипт ранее не обнаруживал пробему с Team (нужно чтобы скрипт не записывал в лог одно и то же событие каждый проход цикла)
            {
                Add-Content -Path $LogPath -Value "****** ============== ******", ((Get-Date -Format "yyyy.MM.dd   HH:mm:ss" | Out-String) + "Teaming group has been DOWN. Node hasn't gone into maintance mode"), " " # Добавляем запись в лог
            }
        }
        
        $TeamWasBad = $true # Указываем что скрипт обнаружил проблему с Team
        
        if (!(Test-Path -Path 'c:\DLC-TeamGroup_Down.tmp')) # Если нет файла
        {
            New-Item -Path 'c:\DLC-TeamGroup_Down.tmp' -ItemType File | Out-Null # Создаем файл (нужно для какого-либо внешнего мониторинга проблемы)
        }

        if (Test-Path -Path 'c:\DLC-TeamGroup_Degraded.tmp') # Если есть файл
        {
            Remove-Item -Path 'c:\DLC-TeamGroup_Degraded.tmp' -Force # Удаляем файл, т.к. у нас уже иное состояние
        }
    }

    if ((Get-NetLbfoTeam).Status -eq 'Up') # Если Team интерфейс в нормальном состоянии
    {
        if ( ($EverythingOkay -eq $false) -and ( (Get-ClusterNode -Name "$env:COMPUTERNAME").State -ne 'Up') ) # Если скрипт фиксировал с помощью переменной проблему с Team и текущий узел кластера не поднят
        {
            $TempVar = (Resume-ClusterNode -Failback Immediate | Out-String) # Выводим хост из режима обслуживания с фэилбэком ролей и записываем вывод действия в переменную
            Add-Content -Path $LogPath -Value "****** ============== ******", ((Get-Date -Format "yyyy.MM.dd   HH:mm:ss" | Out-String) + "Teaming group has been UP"), $TempVar, " " # Добавляем запись в лог
        } else
        {
            if ($TeamWasBad -eq $true) # Если скрипт ранее обнаруживал проблему с Team
            {
                Add-Content -Path $LogPath -Value "****** ============== ******", ((Get-Date -Format "yyyy.MM.dd   HH:mm:ss" | Out-String) + "Teaming group has been UP. Node hasn't resumed from maintance mode"), " " # Добавляем запись в лог
            }
        }

        $EverythingOkay = $true # Сообщаем в переменную что с Team все в порядке
        $TeamWasBad = $false # Снимаем состояние обнаружения проблемы
        $TeamWasDegraded = $false # Снимаем состояние Degraded

        if (Test-Path -Path 'c:\DLC-TeamGroup_Degraded.tmp') # Если есть файл
        {
            Remove-Item -Path 'c:\DLC-TeamGroup_Degraded.tmp' -Force # Удаляем его
        }

        if (Test-Path -Path 'c:\DLC-TeamGroup_Down.tmp') # Если есть файл
        {
            Remove-Item -Path 'c:\DLC-TeamGroup_Down.tmp' -Force # Удаляем его
        }
    }

    if ((Get-NetLbfoTeam).Status -eq 'Degraded') # Если состояние Team интерфейса Degraded
    {
        $TeamWasBad = $true # Указываем что скрипт обнаружил проблему с Team
        if ($TeamWasDegraded -eq $false) # Если скрипт еще не сделал запись в лог
        {
            Add-Content -Path $LogPath -Value "****** ============== ****** ", ((Get-Date -Format "yyyy.MM.dd   HH:mm:ss" | Out-String) + "Teaming group has been DEGRADED"), " " # Добавляем запись в лог
        }
        $TeamWasDegraded = $true # Указываем что скрипту больше не нужно делать запись в лог по этому событию

        if (!(Test-Path -Path 'c:\DLC-TeamGroup_Degraded.tmp')) # Если нет файла
        {
            New-Item -Path 'c:\DLC-TeamGroup_Degraded.tmp' -ItemType File | Out-Null # Создадим файл
        }

        if (Test-Path -Path 'c:\DLC-TeamGroup_Down.tmp') # Если есть файл
        {
            Remove-Item -Path 'c:\DLC-TeamGroup_Down.tmp' -Force # Удалим файл, т.к. у нас уже иное состояние
        }
    }

    Start-Sleep -Seconds 59 # Ждем n секунд

}
 
<< Первая < Предыдущая 1 2 3 4 5 6 7 8 9 10 Следующая > Последняя >>

Страница 6 из 20
Главная страница Microsoft POWERSHELL