Category Archives: PowerShell

PowerShell

Active Directory i PowerShell – operacje na grupach

Wyświetlenie obiektów należących do grupy o nazwie GroupName

Get-ADGroupMember GroupName | Format-Table name

Wyświetlenie wszystkich grup, do których należy użytkownik o nazwie UserName

Get-ADPrincipalGroupMembership UserName | Format-Table name

Wyświetlenie użytkowników należących do grupy zabezpieczeń o nazwie SecureGroup.

Get-ADUser -filter 'memberOf -recursivematch "CN=SecureGroup, OU=IT, DC=domena, DC=local"' | Format-Table name

Dodanie użytkowników OU do grupy zabezpieczeń.

Get-ADUser -SearchBase ‘OU=nazwaOU,DC=test,DC=local’ -Filter * | ForEach-Object {Add-ADGroupMember -Identity ‘NazwaGrupyZabezpieczen’ -Members $_ }

Active Directory i PowerShell – tworzenie kopii zapasowej

#zdefiniowanie źródła
Get-WBVolume -AllVolumes
$vol = Get-WBVolume -VolumePath c:

#zdefiniowanie miejsca docelowego
$networkBackupLocation = New-WBBackupTarget -NetworkPath \\DC2\backups

#Włączenie polisy - ustawienie atrybutu SystemState na True
Add-WBSystemState -Policy backupPolicy 

#zdefiniowanie i konfiguracja polisy
$backupPolicy = New-WBPolicy
Add-WBVolume -Policy -$backupPolicy -Volume $vol
Add-WBBackupTarget -Policy $backupPolicy -Target $networkBackupLocation

#uruchomienie polisy
Start-WBBackup -Policy $backupPolicy

Active Directory i Powershell – operacje na użytkownikach i komputerach

Artykuł w budowie (Będzie więcej skryptów 🙂

Odblokowanie wszystkich zablokowanych kont:

Search-ADAccount -LockOut | Unlock-ADAccount

Znalezienie użytkownika:

Get-ADUser -Filter 'Name -like "*userName"'

Reset hasła użytkownikowi userName:

Set-ADAccountPassword userName -NewPassword (Read-Host - AsSecureString 'New Password') -Reset

Automatyczny reset hasła wielu użytkownikom:

Add-Type -AssemblyName 'System.Web'

$userAccounts = 'user1', 'user2'
foreach ($account in $userAccounts) {
$plain_text_password = [System.Web.Security.Membership]::GeneratePassword(13, 3)
Write-Host "Resetting $account password to $plain_text_password ..."
Set-ADAccountPassword $account -NewPassword ($plain_text_password | convertto-securestring -asplaintext -force)
}

Dodanie komputera do domeny

add-computer –domainname sieciunia.local -Credential sieciunia.local\administrator -restart –force

Wyświetlenie użytkowników nieaktualnych, którzy zmieniali hasło dalej niż 31 dni temu i wyłączenie / przeniesienie / usunięcie ich:

$password_Age = (Get-Date).adddays(-31)
$users_with_old_password = Get-ADUser -Filter * -Properties PasswordLastSet | 
Where-Object {
$_.PasswordLastSet -and
$_.PasswordLastSet -lt $password_Age
}
$users_with_old_password 

#Wylaczenie kont w ktorych haslo nie bylo zmieniane
$users_with_old_password | Set-ADUser -Enabled $false

#Wlaczenie konta administratora jesli wczesniej zostalo omylkowo wylaczone
$adminAccount = Get-ADUser -Filter * -Properties Name | ? { $_.Name -like 'admin*' }
$adminAccount | Set-ADUser -Enabled $true

#Znalezienie wszystkich wylaczonych kont
$disabledUsersAccounts = Search-ADAccount -AccountDisabled -UsersOnly

#przeniesienie uzytkownikow do nowego OU o nazwie zablokowani użytkonicy
$disabledUsersAccounts | Move-ADObject -TargetPath "OU=Disabled Users,DC=sieciunia, DC=local"

#usowanie kont za potwierdzeniem (nie mozna usowac kont wbudowanych)
$disabledUsersAccounts | Remove-ADUser -Confirm:$false

 

PowerShell – wyszukiwanie pliku o danej nazwie i w przypadku jego znalezienia wysłanie powiadomienia na e-mail.

Zadaniem poniższego skryptu PS jest przeszukiwanie zasobu sieciowego w poszukiwaniu plików mających w nazwie datę wczorajszą, oraz wysłania ich nazw w wiadomości e-mail w przypadku ich znalezienia.

$emailFrom = 'powiadomienia@domena.pl' 
$secstring = '01000000d08c9ddf0115d1118c7a00c04fc297eb0100000060a18ed3a9312c4c939f8408d224ed9f00000000020000000000106600000001000020000000e0d0d688c598b0dc944b81409d0f7ab8dea52d0612f7d5e56b84c09d0d13eb07000000000e800000000200002000000036d3059ac438090bdbb1a0b4b2bb2fa7a5ffab65d96fa02a1aeab9667b54bb5f20000000a1f6442ff2bb3d90f1fd93b06d9178eec8239eb71fe330ff3c8fe5167b9120d1400000002dca53a7f97ac0d52ea085d15fa3dd501aec6e7eb72e5c23577ec53ef7f40c498573d0d7f58d57ca54521b0a4ffc77618d33178363f897ec08a72305078af168'
$credential = New-Object System.Management.Automation.PSCredential($emailFrom, ($secstring | ConvertTo-SecureString))
$patch = '\\192.168.5.2\pliki\'
$date = Get-Date -Format "yyyy_MM_dd"
$day_minus_one = (Get-Date).AddDays(-1) | Get-Date -Format "yyyy_MM_dd"
$time = get-Date -Format "HH_mm"
$emailTo = "odbiorca1@domena.pl" , "odbiorca2@domena.pl"

$files = Get-ChildItem -path $patch\*$day_minus_one.pdf
"Wykonanie skryptu dnia $date o godzinie $time" >> $patch\script_activity.txt

if ($files) { 
$files | Export-CSV $patch\revoke_privileges_$date.txt 
$body = $files | Out-String
Send-MailMessage -To $emailTo -From $emailFrom -encoding utf8 -Subject 'Odbior uprawnien uzytkownikowi' -Body "Ponizej wykazane sa nazwy plikow - skanow wnioskow o nadanie uprawnien czasowych do pracy w systemie, ktore trzeba wycofac. $body Aby skrypt spelnial swoje zadanie data odebrania uprawnienia powinna znajdowac sie na koncu nazwy pliku PDF w formacie rrrr_MM_dd, tj. np KowalskiJanek_2023_05_05_W_KB_2023_05_10.pdf." <# -Attachments $patch\revoke_privileges_$date.txt #> -Credential $credential -SmtpServer 'server.smtp.com.pl' -Port 587
}

else { 
exit 
}

SecureString (zaszyfrowane hasło – w tym przypadku do konta e-mail) można uzyskać konwertując hasło za pomocą komendy:

"haslo_czystym_tekstem" | ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Out-File "d:\Password.txt"

SecureString może odkodować wyłącznie ten użytkownik Windows, który je zakodował, dlatego też najbezpieczniej jest utworzyć dedykowane konto Windows, które będzie używane wyłącznie do uruchamiania skryptu.
Skrypt PS można również skonwertować do pliku *.exe np. przy pomocy programu Win-PS2EXE-GUI. Jednak nawet z pliku exe można wyciągnąć SecureStinga.

Źródło:

https://stackoverflow.com/questions/14319272/powershell-scan-folder-for-certain-file-name-and-write-to-a-log-file-and-email
https://www.itprotoday.com/powershell/how-encrypt-powershell-scripts
https://powershellguru.com/instant-guide-to-convert-ps1-to-exe/

PowerShell remoting

Wymagania dot.  zdalnego połączenia przez PS:

  1. Otwarte porty: WSMan: 5985. Jeżeli połączenie ma się odbywać przez SSL, otwarty również port 5986;
  2. Sieć nie publiczna: Prywatna lub Firmowa;
  3. Uruchomiona usługę WinRM, skonfigurować uruchamianie w auto starcie;
  4. Utworzony Listenera dla adresu IP lub nazwy komputera.

Uruchomienie PS Remoting na komputerach pracujących w domenie:

  1. Konfiguracja auto startu usługi:
    Computer Configurations / Windows Settings / Security Settings / System Services / Windows Remote Management (WS-Management),
  2. Konfiguracja Listenera:
    Computer Configurations / Administrative Templates / Windows Components / Windows Remote Managament (WinRM) / WinRM Service / Allow remote server management through WinRM
    Opcja skonfigurowana na Enable, w miejscu IPv4 filter gwiazdka (*)
  3. Konfiguracja zapory sieciowej:
    Computer Configurations / Windows Settings / Security Settings / Windows Defender Firewall with Advanced Security / Inbound Rules – Wybrać usługę Windows Remote Management (HTTP-In)

Zamiast klikologii można posłużyć się komendami Powershell. Na maszynie, do której mamy się łączyć należy otworzyć PS z podwyższonymi uprawnieniami i wydać następujące komendy:

$Interface_Index = Get-NetConnectionProfile | Select -ExpandProperty InterfaceIndex
Set-NetConnectionProfile -InterfaceIndex $Interface_Index -NetworkCategory Private
Enable-PSRemoting -Force
Restart-Service WinRM

Dodatkowo na komputerze z którego mamy się łączyć do innych maszyn należy uruchomić PS z podwyższonymi uprawnieniami i wydać następującą komendę:

Set-Item wsman:\localhost\client\trustedhosts *

Samo połączenie do zdalnego komputera odbywa się poprzez wydanie polecania:

Enter-PSSession -ComputerName 192.168.5.7 -Credential admin

Możliwe jest wykonanie skryptu lub komendy na wielu komputerach naraz poprzez polecenie:

Invoke-Command -ComputerName 192.168.5.7, 192.168.5.8 -ScriptBlock { Get-ChildItem C:\ } -credential admin_account_name

lub uruchomić skrypt PowerShell:

Invoke-Command -ComputerName 192.168.5.7, 192.168.5.8 -FilePath C:\skrypty\tajemniczy_skrypt.ps1

Źródła:
http://powershell.org/wp/2012/08/06/ebook-secrets-of-powershell-remoting/
http://blogs.technet.com/b/heyscriptingguy/archive/2013/11/29/remoting-week-non-domain-remoting.aspx

Windows Server 2012 R2 Core – konfiguracja NIC Teaming

powershell
Get-NetAdapter
Get-NetAdapter ethernet0 | fl *

fl od format list – wszystkie właściwości interfejsu.
Następnie należy wyłączyć na jednym interfejsie usługę DHCP Client i nadać mu statyczny adres IP.

Get-NetAdapter ethernet0 | Set-NetIPInterface -dhcp disabled
Get-NetAdapter ethernet0 | new-netipaddress -IPAddress 192.168.0.104 -DefaultGateway 192.168.0.1 -PrefixLenght 24
Set-DNSClientServerAddress -InternetAlias ethernet0 -ServerAddress 192.168.0.100

Po nadaniu adresu IP jednemu interfejsowi można rozpocząć konfiguracją funkcji NIC Teaming

new-netbfoteam -name "Nasz Team" -TeamMembers ethernet0,ethernet1 -TeamingMode switchindependent -LoadBalancingAlgorithm dynamic

Nazwa netbfoteam pochodzi od Net Balance and Fail Over Team.
Teraz wynik komendy Get-NetAdapter pokaże 3 interfejsy – 2 interfejsy sieciowe fizyczne, oraz interfejs „Nasz Team”, który możemy konfigurować jak fizyczny interfejs (adresacja IP itp.).