Triki i podpowiedzi

AI GPT-4

Żart o agnostykach, który zbudowali super inteligencję, by spytać ją o istnienie Boga. 

Na pytanie „Czy Bóg istnieje?”

Otrzymali odpowiedź: „Teraz już TAK!”

Powershell

Pozostałe

1PowerShell wysyłanie FTP

Aby wysłać plik na serwer FTP za pomocą PowerShell, można użyć modułu Microsoft.PowerShell.Management, który zawiera funkcje do zarządzania usługą FTP.

Najpierw musisz zainstalować ten moduł, jeśli go jeszcze nie masz. W PowerShell wykonaj następujące polecenie:

Install-Module -Name Microsoft.PowerShell.Management -Force
 
SKRYPT:
Wysyłanie na FTP

# Importowanie modułu
Import-Module Microsoft.PowerShell.Management

# Dane logowania FTP
$ftpServer = "adres_ftp"
$ftpUser = "login_ftp"
$ftpPassword = "hasło_ftp"

# Lokalna ścieżka do pliku
$localFile = "C:\ścieżka\do\pliku\lokalnego.txt"

# Ścieżka na serwerze FTP, gdzie chcesz umieścić plik
$remotePath = "/ścieżka/na/serwerze/ftp/"

# Tworzenie sesji FTP
$ftpSession = New-Object -TypeName System.Net.WebClient

# Logowanie do serwera FTP
$ftpSession.Credentials = New-Object -TypeName System.Net.NetworkCredential($ftpUser, $ftpPassword)

# Wysyłanie pliku na serwer FTP
$ftpSession.UploadFile("$ftpServer/$remotePath" + (Split-Path -Path $localFile -Leaf), $localFile)

# Zamykanie sesji FTP
$ftpSession.Dispose()

----------------------------------------------------------------------------


Pobieranie z FTP:

# Importowanie modułu
Import-Module Microsoft.PowerShell.Management

# Dane logowania FTP
$ftpServer = "adres_ftp"
$ftpUser = "login_ftp"
$ftpPassword = "hasło_ftp"

# Ścieżka na serwerze FTP do pobrania pliku
$remoteFile = "/ścieżka/na/serwerze/ftp/plik.txt"

# Lokalna ścieżka, gdzie chcesz zapisać pobrany plik
$localPath = "C:\ścieżka\do\katalogu\lokalnego\"

# Tworzenie sesji FTP
$ftpSession = New-Object -TypeName System.Net.WebClient

# Logowanie do serwera FTP
$ftpSession.Credentials = New-Object -TypeName System.Net.NetworkCredential($ftpUser, $ftpPassword)

# Pobieranie pliku z serwera FTP
$ftpSession.DownloadFile("$ftpServer$remoteFile", $localPath + (Split-Path -Path $remoteFile -Leaf))

# Zamykanie sesji FTP
$ftpSession.Dispose()

----------------------------------------------------------------------------

Zastąp "adres_ftp", "login_ftp" i "hasło_ftp" odpowiednimi danymi dostępowymi do serwera FTP. Ustaw również odpowiednie ścieżki lokalne i na serwerze FTP.

Po wykonaniu tego kodu plik zostanie przesłany na serwer FTP, a następnie sesja FTP zostanie zamknięta.

Miej na uwadze, że ten kod wykorzystuje moduł Microsoft.PowerShell.Management, który nie jest dostępny w starszych wersjach PowerShell. Jeśli korzystasz z starszej wersji, może być konieczne zainstalowanie innego modułu, takiego jak WinSCP, lub uaktualnienie PowerShell do nowszej wersji.

Uwaga: Zweryfikuj w środowisku testowym zanim użyjesz w produkcji!!!

2Backup Baz danych SQL - wersja z 2022r

Skrypt w BUDOWIE

Scenariusz:

1. Należy zrobić kopie baz danych z Serwera SQL w formacie: NazwaBazy.bak,

2. Wszyskie kopie BAZ DANYCH mją zostać spakowane do archiwum ZIP w formacie: archiwum-datawykonania.zip,

3. Skopiowanie wszystkich plików ZIP do innej lokalizacji (dysk lokalnydysk sieciowy, FTP, azureBlob....),

4. Skasowania z bierzącego katalogu (C:\APP_BACKUP) wszystkich plików *.bak (na bierząco),

5. Skasowania z bierzącego katalogu (C:\Archiwum) plików archiwum ZIP starszych niż 5 dni,

4. Skasowania z bierzącego katalogu (C:\APP_BACKUP) wszystkich plików *.zip (na bierząco),

6. Skrypt ma się wykonywać codziennie według harmonogramu zadać.

Jeżeli są jakieś pomysły to poproszę o Wasze wersje 😉 na: email

 

 

#Zmienne

$ServerInstance = "CU01SQL\INSERTGT"

$DataBase1 = „baza1”

$DataBase2 = "baza2”

$DataBase3 = "baza3”

$DataBase4 = "baza4”

$DataBase5 = "baza5”

$SharedFolder = "\\cu01sql\APP_BACKUP"

$destenation = "C:\APP_BACKUP"

$Date = Get-Date -format yyyyMMdd

$Archive = "Archiwum"

$ThisBak = (Get-Date).AddDays(0).ToString("dd-mm-yyyy")

$OldFile = (Get-Date).AddDays(-5).ToString("dd-mm-yyyy")

$compressionLevel= [System.IO.Compression.CompressionLevel]::Optimal

 

#Call SQL Command

Backup-SqlDatabase -ServerInstance $ServerInstance -Database $DataBase1 -BackupFile "$($SharedFolder)\$DataBase1-$Date.bak"

Backup-SqlDatabase -ServerInstance $ServerInstance -Database $DataBase2 -BackupFile "$($SharedFolder)\$DataBase2-$Date.bak"

Backup-SqlDatabase -ServerInstance $ServerInstance -Database $DataBase3 -BackupFile "$($SharedFolder)\$DataBase3-$Date.bak"

Backup-SqlDatabase -ServerInstance $ServerInstance -Database $DataBase4 -BackupFile "$($SharedFolder)\$DataBase4-$Date.bak"

Backup-SqlDatabase -ServerInstance $ServerInstance -Database $DataBase5 -BackupFile "$($SharedFolder)\$DataBase5-$Date.bak"

 

#ZIP Kompresja plików *.bak do *.zip z datą w nazwie--------------------------------------------------------
Compress-Archive -Path C:\APP_BACKUP\*.bak -Update -DestinationPath $Destenation\Archiwum_$DateTime

#Usuwanie plików *BAK

Remove-Item C:\APP_BACKUP\*.bak

 

#Usówanie plików starszych niz 5 dni C:\archiwum .*ZIP-------------------------------------------------------

Get-ChildItem –Path $DestArchiwum -Recurse | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(-5))} | Remove-Item

Kopia na do katalogu C:\APP_BACKUP\ i na Serwer NAS-------------------------------------------------------
$NetworkPath = "\\192.168.1.3\backup\cumulus"
$UserAndDomain = "backup"
$pass = "xxxxxxxx" #hasło

Copy-Item -Path "C:\APP_BACKUP\*.zip" -Destination "C:\archiwum" -recurse -Force
New-SMBMapping -LocalPath 'S:' -RemotePath $NetworkPath -UserName $UserAndDomain -Password $pass
Copy-Item -Path "C:\APP_BACKUP\*.zip" -Destination "S:\" -recurse -Force

#Usówanie plików C:\APP_BACKUP\ .*ZIP-------------------------------------------------------
Get-ChildItem –Path $Destenation -Recurse | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(0))} | Remove-Item

______________________________________________________________________________________________________________________

WERSJA z pętelką

 

# !!!!! zamiast wartości w sekcji #Call SQL Command wprowadzasz  foreach i w zmiennych dodajesz listę baz danych $Database = 'BAZA1', 'BAZA2', 'BAZA3', ... ;

 

$ServerInstance = "CU01SQL\INSERTGT"
$Destenation = "C:\APP_BACKUP"
$Database = 'BAZA1', 'BAZA2', 'BAZA3', ... ;

 

foreach ($dbname in $Database)
{
Backup-SqlDatabase -ServerInstance $ServerInstance –Database $dbname -BackupFile "$Destenation\$dbname.bak" -PassThru
}

 

______________________________________________________________________________________________________________________

#Poziomy kompresji
-CompressionLevel Optimal
-CompressionLevel Fastest
-NoCompression
Opcjonalnie można użyć parametru -CompressionLevel z jedną z trzech wartości: Optimal, NoCompression lub Fastest.
Optimal jest ustawieniem domyślnym, jeśli parametr -CompressionLevel nie jest ustawiony;
używa najlepszej dostępnej kompresji, ale może to potrwać dłużej niż użycie najszybszej. Aby utworzyć archiwum bez kompresji, użyj wartości NoCompression.

 

#Description

The Compress-Archive cmdlet creates a compressed, or zipped, archive file from one or more specified files or directories. An archive packages multiple files, with optional compression, into a single zipped file for easier distribution and storage. An archive file can be compressed by using the compression algorithm specified by the CompressionLevel parameter.

The Compress-Archive cmdlet uses the Microsoft .NET API System.IO.Compression.ZipArchive to compress files. The maximum file size is 2 GB because there's a limitation of the underlying API.

3Backup Baz danych SQL - wersja z 17.03.2023
Kolejna odsłona skryptu 

Backup dodatkowo poza wykonaniem kopi baz SQL, archiwizuje je do pliku zip, archiwizuje je we wskazanych miejscach, na końcu wysyła e-mail z potwierdzeniem wykonania kopi oraz tabelą zawierającą nazwy plików i ich wielkość.

 

# BY Marcin Szary http://www.szary.pl marcin@szary.pl
#
#Zmienne
$ServerInstance = "nazwa_serwera\nazwa_instancji_SQL"
$Database = 'nazwa_bazy_danych_taka_jak_w_SQL', 'nazwa_bazy_danych';
$SharedFolder = "\\nazwa_serwera\udział_sieciowy"
$Destenation = "C:\APP_BACKUP"
$DestArchiwum = "D:\archiwum"
$DestArchiwumC = "C:\archiwum"
$ArchiveFile = "$Database-$(Get-Date -Format 'dd-mm-yyyy').zip"
$DateTime = get-date -Format "yyyy-MM-dd_HH-mm"
$ThisBak = (Get-Date).AddDays(0).ToString("dd-mm-yyyy")
$OldFile = (Get-Date).AddDays(-5).ToString("dd-mm-yyyy")
$compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal
$TimeStampDate = Get-Date -UFormat "%Y-%m-%d"
$TimeStampTime = Get-Date -UFormat "%H:%M:%S"
$Hostname = (Get-WmiObject Win32_ComputerSystem).Name
$Domain = (Get-WmiObject Win32_ComputerSystem).Domain
$ArchiveFile = "$Database-$(Get-Date -Format 'dd-mm-yyyy').zip"
$percentWarning = 20
$percentCritcal = 10
$ListDisk = Get-WmiObject -Class
$TimeStampDate = Get-Date -UFormat "%Y-%m-%d"
$TimeStampTime = Get-Date -UFormat "%H:%M:%S"
$NetworkPath = \\192.168.81.143\backup\ #lokalny adres do serwera backup’u np. NAS
$NasUser = "login do NAS"
$pass = "Hasło do NAS"
$securepass = ConvertTo-SecureString $pass -AsPlainText -Force
$creds = New-Object System.Management.Automation.PSCredential ($NasUser, $securepass)
# Definiowanie zmiennych e-mail
$smtpServer = "smtp.serwer.poczt"
$smtpPort = 587
$username = "login@serwer.pl"
$password = "hasło_czystym_tekstem"
$from = "email@serwer.pl "
$to = "marcin@serwer.pl"
$cc = "user@serwer.pl"
#Call SQL Command--------------------------
foreach($dbnamein$Database)
{ Backup-SqlDatabase -ServerInstance $ServerInstance -Database $dbname -BackupFile "$Destenation\$dbname.bak" -PassThru }
#ZIP Kompresjaplikow *.bak do *.zip-----------------
Compress-Archive -Path C:\APP_BACKUP\'nazwa_bazy_danych1.bak -Update -DestinationPath $Destenation\'nazwa_bazy_danych_DateTime
Compress-Archive -Path C:\APP_BACKUP\'nazwa_bazy_danych2.bak -Update -DestinationPath $Destenation\'nazwa_bazy_danych2_$DateTime
#Compress-Archive -Path C:\APP_BACKUP\*.bak -Update -DestinationPath $Destenation\'nazwa_archiwum_$DateTime ----możesz zarchiwizować wszystkie pliki *.bak do jednego archiwum ZIP
#usowanie plików z tymczasowego folderu *BAK
Remove-Item C:\APP_BACKUP\*.
#Kopiowanie pliki
Copy-Item -Path "C:\APP_BACKUP\*.zip" -Destination "D:\archiwum" -recurse -Force
New-PSDrive -Name S -PSProvider FileSystem -Root $NetworkPath -Credential $creds -Persist #mapowanie zasobu serwera NAS na czas operacji
Copy-Item -Path "C:\APP_BACKUP\*.zip" -Destination "S:\" -recurse -Force
#Usowanie plikow C:\APP_BACKUP\ & Usowanie plikow starszych niz 5 i 10 dni .*ZIP -------------------------------------------------------
Get-ChildItem -Path $Destenation -Recurse | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(0))} | Remove-Item #FOLDER TYMCZASOWY
Get-ChildItem -Path $DestArchiwum -Recurse | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(-5))} | Remove-Item #na dysku D:\Adchiwum
Get-ChildItem -Path $DestArchiwumC -Recurse | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(-5))} | Remove-Item #na dysku c:\Adchiwum
Get-ChildItem -Path $DestArchiwumNAS -Recurse | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(-10))} | Remove-Item #na qnap
net use S: /delete #usówanie mapowania
#Liczba plików w folderach archiwum
$numFilesC = (Get-ChildItem -Path $DestArchiwumC -File).Count
$numFilesD = (Get-ChildItem -Path $DestArchiwum -File).Count
# Pobranie listy plików z wybranej ścieżki
$files = Get-ChildItem $DestArchiwum
# Rozpoczęcie tworzenia tabelki HTML
$htmlfile = "<table><tr><th>Nazwa pliku</th><th>Wielkości pliku w MB</th></tr>"
# Dla każdego pliku w liście wyświetl nazwę i wielkość plików
foreach ($file in $files) {
$fileName=$file.Name
$fileSize="{0:N2} MB"-f($file.Length/1MB)
$htmlfile+="<tr><td>$fileName</td><td>$fileSize</td></tr>"
}
# Odczyt wolnej przestrzeni na dysku
$driveC = Get-PSDrive C
$freeSpaceMb = [math]::Round($driveC.Free / 1MB)
$totalSpaceMb = [math]::Round($driveC.Used / 1MB) + $freeSpaceMb
$freeSpacePercent = [math]::Round($driveC.Free / $driveC.Used * 100)
$driveD = Get-PSDrive D
$freeSpaceMbD = [math]::Round($driveD.Free / 1MB)
$totalSpaceMbD = [math]::Round($driveD.Used / 1MB) + $freeSpaceMb
$freeSpacePercentD = [math]::Round($driveD.Free / $driveD.Used * 100)
# Zakończenie tworzenia tabelki HTML
$body = @"
<html>
<head>
<h2><span style="color:green"> Informacja! CUMULUS Na serwerze $Hostname Backup baz danych SQL wykonana.</span></h1>
<h3><p><span style="color:green">Liczba plików w folderze Archiwum na dysku C: Subiekt Backup - $numFilesC.</span></p></h2>
<p></p>
<h3><p><span style="color:green">Wolna przestrzeń na dysku C: $freeSpaceMb MB ($freeSpacePercent% wolne z $totalSpaceMb MB).</span></p></h2>
<p></p>
<h3><p><span style="color:blue">Liczba plików w folderze Archiwum na dysku D: SQL Backup - $numFilesD.</span></p></h2>
<p></p>
<h3><p><span style="color:blue">Wolna przestrzeń na dysku D: $freeSpaceMbD MB.</span></p></h2>
<p></p>
<h3><p><span style="color:green">Powiadomienie wysłano z serwera $env:computername o $TimeStampTime dnia $TimeStampDate. </span></p></h2>
<p></p>
<h3><p><span style="color:red">Nie odpowiadaj na tego maila.</span></p></h3>
$htmlfile
<style>
table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
th, td {
padding: 5px;
}
</style>
</head>
</html>
</body>
"@
$html += "</table>"
# Tworzenie obiektu wiadomości e-mail
$message = New-Object System.Net.Mail.MailMessage $from, $to, $cc
$message.Subject = $subject = "Informacja! Kopia SQL wykonana."
$message.IsBodyHtml = $true
$message.Body = $body
# Tworzenie obiektu serwera SMTP z uwierzytelnieniem
$smtp = New-Object System.Net.Mail.SmtpClient $smtpServer, $smtpPort
$smtp.EnableSsl = $False
$smtp.Credentials = New-Object System.Net.NetworkCredential($username, $password)
# Wysyłanie wiadomości e-mail
$smtp.Send($message)
# Wyświetlenie komunikatu o zakończeniu wysyłania e-maila
#Write-Host "E-mail został wysłany do $recipientEmail."
4Backup Baz danych SQL - wersja z 15.12.2023

W tej wersji został żal zastosowany kompresor 7z, ponieważ wersja z Windows zip ma ograniczenia co do wielkości pliku,. Wersje uruchamiamy za pomocą PowerShell 7.2.

#
# BY Marcin Szary http://www.szary.pl marcin@szary.pl

# Przetestowane w PowerShell 7.2
# winget install --id Microsoft.Powershell --source winget # zainstaluj Powershell 7

# Instalacja Modułów Powershell
Install-Module -Name SqlServer -Force -AllowClobber #Moduł Powershell Microsoft SQL
Install-Module -Name 7Zip4Powershell #Moduł Powershell 7ZIP https://github.com/thoemmi/7Zip4Powershell

#Zmienne
$ServerInstance = "Serwer\instancja"
$Database = 'baza1', 'baza2', 'baza3';
$Destenation = "C:\APP_BACKUP"
$DestArchiwum = "D:\ARCHIWUM"
$DateTime = get-date -Format "yyyy-MM-dd_HH-mm"
$ThisBak = (Get-Date).AddDays(0).ToString("dd-mm-yyyy")
$OldFile = (Get-Date).AddDays(-5).ToString("dd-mm-yyyy"
$TimeStampDate = Get-Date -UFormat "%Y-%m-%d"
$TimeStampTime = Get-Date -UFormat "%H:%M:%S"
$Hostname = (Get-WmiObject Win32_ComputerSystem).Name
$Domain = (Get-WmiObject Win32_ComputerSystem).Domain
$ListDisk = Get-WmiObject -Class Win32_LogicalDisk
$TimeStampDate = Get-Date -UFormat "%Y-%m-%d"
$TimeStampTime = Get-Date -UFormat "%H:%M:%S"
$NetworkPath = "\\192.168.1.3\backup"
$NasUser = "login"
$pass = "hasło"
$securepass = ConvertTo-SecureString $pass -AsPlainText -Force
$creds = New-Object System.Management.Automation.PSCredential ($NasUser, $securepass)
# Definiowanie zmiennych e-mail
$smtpServer = "smtp.domena.pl"
$smtpPort = 587
$username = "backup@domena.pl"
$password = "hasło"
$from = "backup@domena.pl"
$to = "nazwa1@domena.pl"
$cc = "nazwa2@domena.pl"

#Call SQL Command--------------------------------------------------------------------------------------
foreach ($dbname in $Database)
{
Set-Location
Backup-SqlDatabase -ServerInstance $ServerInstance -Database $dbname -BackupFile "$Destenation\$dbname.bak" -PassThru
}

#ZIP Kompresjaplikow *.bak do *.zip-------------------------------------------------------------------
Compress-7Zip -Path $Destenation\baza1.bak -ArchiveFileName $Destenation\baza1$DateTime.7z -Format SevenZip -CompressionLevel High
Compress-7Zip -Path $Destenation\baza2.bak -ArchiveFileName $Destenation\baza2$DateTime.7z -Format SevenZip -CompressionLevel LOW
Compress-7Zip -Path $Destenation\baza3.bak -ArchiveFileName $Destenation\baza3$DateTime.7z -Format SevenZip

#usowanie plikow z tymczasowego folderu *BAK
Remove-Item C:\APP_BACKUP\*.bak

#Kopiowanie plik
Copy-Item -Path $Destenation\*.7z -Destination "D:\archiwum" -recurse -Force
New-PSDrive -Name S -PSProvider FileSystem -Root $NetworkPath -Credential $creds -Persist #podłączenie dysku sieciowego
Copy-Item -Path $Destenation\*.7z -Destination "S:\" -recurse -Force #Kopiowanie na dysk sieciowy

#Usowanie plikow C:\APP_BACKUP\ & Usowanie plikow starszych niz 5 i 10 dni .*ZIP -------------------------------------------------------
Get-ChildItem -Path $Destenation -Recurse | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(0))} | Remove-Item #FOLDER TYMCZASOWY
Get-ChildItem -Path $DestArchiwum -Recurse | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(-5))} | Remove-Item #na dysku D:\Adchiwum
Get-ChildItem -Path $NetworkPath -Recurse | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(-10))} | Remove-Item #na qnap
net use S: /delete #odłączenie dysku sieciowego

#Liczba plikow w folderach archiwum
$numFilesD = (Get-ChildItem -Path $DestArchiwum -File).Count

# Pobranie listy plikow z wybranej sciezki
$files = Get-ChildItem $DestArchiwum

# Rozpoczęcie tworzenia tabelki HTML
$htmlfile = "<table><tr><th>Nazwa pliku</th><th>Wielkosc pliku w MB</th></tr>"

# Dla kazdego pliku w tabeli wyswietl nazwe i wielkosc
foreach ($file in $files) {
$fileName = $file.Name
$fileSize = "{0:N2} MB" -f ($file.Length / 1MB)
$htmlfile += "<tr><td>$fileName</td><td>$fileSize</td></tr>"
}

foreach ($fileC in $filesC) {
$fileNameC = $fileC.Name
$fileSizeC = "{0:N2} MB" -f ($fileC.Length / 1MB)
$htmlfileC += "<tr><td>$fileNameC</td><td>$fileSizeC</td></tr>"
}

# Odczyt wolnej przestrzeni na dysku
$driveC = Get-PSDrive C
$freeSpaceMb = [math]::Round($driveC.Free / 1MB)
$totalSpaceMb = [math]::Round($driveC.Used / 1MB) + $freeSpaceMb
$freeSpacePercent = [math]::Round($driveC.Free / $driveC.Used * 100)
$driveD = Get-PSDrive D
$freeSpaceMbD = [math]::Round($driveD.Free / 1MB)
$totalSpaceMbD = [math]::Round($driveD.Used / 1MB) + $freeSpaceMb
$freeSpacePercentD = [math]::Round($driveD.Free / $driveD.Used * 100)

# Zakonczenie tworzenia tabelki HTML

$body = @"
<html>
<head>
<h2><span style="color:green"> Informacja! CUMULUS Na serwerze $Hostname Backup baz danych SQL wykonana.</span></h1>
<h3><p><span style="color:green">Liczba plikow w folderze Archiwum na dysku C: Subiekt Backup - $numFilesC.</span></p></h2>
<p></p>
<h3><p><span style="color:green">Wolna przestrzen na dysku C: $freeSpaceMb MB ($freeSpacePercent% wolne z $totalSpaceMb MB).</span></p></h2>
<p></p>
<h3><p><span style="color:blue">Liczba plikow w folderze Archiwum na dysku D: SQL Backup - $numFilesD.</span></p></h2>
<p></p>
<h3><p><span style="color:blue">Wolna przestrzen na dysku D: $freeSpaceMbD MB.</span></p></h2>
<p></p>
<h3><p><span style="color:green">Powiadomienie wyslano z serwerze $env:computername o $TimeStampTime dnia $TimeStampDate. </span></p></h2>
<p></p>
<h3><p><span style="color:red">Nie odpowiadaj na tego maila.</span></p></h3>

$htmlfile
$htmlfileC
<style>
table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
th, td {
padding: 5px;
}

</style>
</head>
</html>
</body>

"@
$html += "</table>"

# Tworzenie obiektu wiadomosci e-mail
$message = New-Object System.Net.Mail.MailMessage $from, $to
$message.Subject = $subject = "Informacja! Cumulus, Kopia SQL wykonana."
$message.IsBodyHtml = $true
#$message.Body = $html
$message.Body = $body
# Tworzenie obiektu serwera SMTP z uwierzytelnieniem
$smtp = New-Object System.Net.Mail.SmtpClient $smtpServer, $smtpPort
$smtp.EnableSsl = $False
$smtp.Credentials = New-Object System.Net.NetworkCredential($username, $password)
# Wysylanie wiadomosci e-mail
$smtp.Send($message)
# Wyswietlenie komunikatu o zakonczeniu wysylania e-maila
#Write-Host "E-mail zostal wyslany do $recipientEmail."

5PowerShell Uprawnienia NTFS

Skrypt powershell Nadawania uprawnień do folderów typu HomeDirectory czy folderów przekierowanych np Dokumenty, Obrazy, ... 

WERSJA TESTOWA prace trwają ;)!!!: 

$folder = "C:\DOMOWY"
$myGroup = "TWÓRCA-WŁAŚCICIEL"
$acl = Get-Acl $folder
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule("$myGroup", " FullControl", "ContainerInherit, ObjectInherit", "InheritOnly", "Allow")
$acl.AddAccessRule($rule)

6PowerShell wysyłający e-mail

# Zmienne  - możesz ich użyć w temacie i treści wiadomości

$TimeStampDate = Get-Date -UFormat "%Y-%m-%d"

$TimeStampTime = Get-Date -UFormat "%H:%M:%S"

$Hostname = (Get-WmiObject Win32_ComputerSystem).Name

$Domain = (Get-WmiObject Win32_ComputerSystem).Domain

 

# Temat i treść wiadomości

$Subject = "Informacja! Na serwerze $Hostname Kopia SQL wykonana."

$Body = "Na serwerze $Hostname w domenie $Domain Kopia baz danych SQL InsERT zostala wykonana. 

Powiadomienie wyslano z serwerze $Hostname o $TimeStampTime dnia $TimeStampDate.

Nie odpowiadaj na tego maila.

Pozdrawiam

"

 

# Dane do maila

$From = "backup@domena.pl"

$U = $From

$To = "admin1@domena.pl"

$Cc = "admin2@domena.pl"

$SMTPServer = “poczta.domena.pl"

$SMTPPort = "port SMTP"

$PSW = ’hasło do serwera poczty’

$SecurePassword = ConvertTo-SecureString $PSW –AsPlainText –force

$Cred = New-object System.Management.Automation.PSCredential ($U,$SecurePassword)

 

Send-MailMessage -From $From- To $To -Subject $Subject -Body $Body -SmtpServer $SMTPServer -port $SMTPPort -UseSsl -Credential (New-object System.Management.Automation.PSCredential $U,$SecurePassword) 

7PowerShell Nowa Jednostka Organizacyjna

Skrypt powershell do tworzenia nowych Jednostek Organizacyjnych w domenie "OU":

$csv = Import-Csv -Path "c:\skrypt\NewOU.csv" -Delimiter ";"

ForEach ($itemIn$csv)

{

New-ADOrganizationalUnit -Name $item.Name -Path $item.Path -ProtectedFromAccidentalDeletion: $true -OtherAttributes:@{"c"="PL";"co"="Polska";"countryCode"="616"} -State $item.State -City $item.City -Street $item.Street

}

___________________________________________________________________________________________________________________________

Polecenie powershell które pobierze wszystkie OU z DOMENY i zapiesz w pliku *.csv

Pobierz wszystkie jednostki organizacyjne znajdujące się w domenie i zapisz je w pliku tekstowym: 

Get-ADOrganizationalUnit -Filter * | Format-Table distinguishedName  #Wyświetlenie listy Jednostek Organizacyjnych 

Get-ADOrganizationalUnit -Filter * | export-csv 'C:\skrypt\listaOU.csv' #Eksport wszystkich danych OU do pliku 

Get-ADOrganizationalUnit -Filter * -Properties * | select name,distinguishedName | Export-Csv c:\skrypty\test.csv
#Eksport nazwy i nawy wyróżniającej do pliku

 

 

___________________________________________________________________________________________________________________________

 

Skrypt powershell do  modyfikujący/włączający w OU atrybut "zabezpieczenie przed przypadkowym usunięciem":

 

$csv = Import-Csv -Path "c:\skrypt\NewOU.csv" -Delimiter ";"

ForEach ($itemIn$csv)

{

Set-ADOrganizationalUnit -Identity$item.Identity -ProtectedFromAccidentalDeletion:$true

}

 Plik odpowiedzi NewOU.csv

Name;Path;State;City;Street;Identity
"Kadry";"OU=Fabryka,DC=szary,DC=pl";"Pomorskie";"Gdynia";"Morska 20";"OU=Kadry,OU=Fabryka,DC=szary,DC=pl"
"Projekty";"OU=Fabryka,DC=szary,DC=pl";"Pomorskie";"Gdynia";"Wichrowa 20";"OU=Projekty,OU=Fabryka,DC=szary,DC=pl"

 

8PowerShel Nowy Udział Sieciowy

Skrypt powershell do utworzenia udziału sieciowego:

$csv=Import-Csv-Path "c:\skrypt\FolderShare.csv" -Delimiter";"

ForEach ($itemIn$csv)

{

New-SmbShare -Name $item.Name -Path $item.Path -Change $item.GroupName1 -FullAccess $item.GroupName2

}

___________________________________________________________________________________________________________________________

Plik odpowiedzi FolderShare.csv, dowolna ilość folderów, w dowolnych lokalizacjach dla dowolnych grup użytkowników czy użytkownika 🙂 :

 

Name;Path;GroupName1;GroupName2
Home$;C:\DANE\Home;Finance;Administrator
Data$;C:\DANE\Data;Finance;Administrator
Wspolne$;C:\DANE\Wspolne;Finance;Administrator

 

Widok nadanych uprawnień ukrytego udział Home$ dla grupy Finance i użytkownika Administrator

uprawnienia

 
 
 
9PowerShell Nowy Użytkownik - Script

Skrypt powershell do tworzenia nowych kont urzytkowników:

 

$csv=Import-Csv-Path"c:\skrypt\UserDane.csv"-Delimiter";"

ForEach ($itemIn$csv)

{

New-ADUser

-Name $item.Name

-Path $item.Path

-GivenName $item.GivenName

-Surname $item.Surname

-SamAccountName $item.SamAccountName

-UserPrincipalName $item.UserPrincipalName

-DisplayName $item.DisplayName

-Type $item.Type

-HomeDrive $item.HomeDrive

-HomeDirectory $item.HomeDirectory

-EmailAddress $item.EmailAddress

-Title $item.Title

-Department $item.Department

-Company $item.Company

-AccountPassword (ConvertTo-SecureString -AsPlainText $item.password -Force)

-ChangePasswordAtLogon $true 

-Enabled $true

 

___________________________________________________________________________________________________________________________________________________

Plik odpowiedzi UserDane.csv - 100, 1000, czy milion użytkowników nie ma znaczenia, każdu user to jedna linijka! 🙂

 


Name;Path;GivenName;Surname;SamAccountName;UserPrincipalName;DisplayName;Type;HomeDrive;HomeDirectory;EmailAddress;Title;Department;Company;Identity;MemberOf;password
Jan Kowalski;OU=Chirurgia,OU=szpital,DC=szary,DC=pl;Jan;Kowalski;Jan.Kowalski;Jan.Kowalski@szary.pl;Jan Kowalski;user;H:;\\adds2\HOME\%username%\;Jan.Kowalski@szary.pl;Chirurg;Chirurgia;Szpital;"CN=Jan Kowalski,OU=Chirurgia,OU=szpital,DC=szary,DC=pl";"CN=Finance,OU=Chirurgia,OU=szpital,DC=szary,DC=pl";P@ssw0rd!!

Ania Janicka;OU=Chirurgia,OU=szpital,DC=szary,DC=pl;Ania;Janicka;Ania.Janicka;Ania.Janicka@szary.pl;Ania Janicka;user;H:;\\adds2\HOME\%username%\;Ania.Janicka@szary.pl;Chirurg;Chirurgia;Szpital;"CN=Ania Janicka,OU=Chirurgia,OU=szpital,DC=szary,DC=pl";"CN=IT,OU=Chirurgia,OU=szpital,DC=szary,DC=pl";P@ssw0rd!!

Tomek Mars;OU=Chirurgia,OU=szpital,DC=szary,DC=pl;Tomek;Mars;Tomek.Mars;Tomek.Mars@szary.pl;Tomek Mars;user;H:;\\adds2\HOME\%username%\;Tomek.Mars@szary.pl;Chirurg;Chirurgia;Szpital;"CN=Tomek Mars,OU=Chirurgia,OU=szpital,DC=szary,DC=pl";"CN=Kadry,OU=Chirurgia,OU=szpital,DC=szary,DC=pl";P@ssw0rd!!>

___________________________________________________________________________________________________________________________________________________

 Opis:

  • Name - Nazwa konta
  • Path - Ścieżka gdzie konto ma zostać utworzone (w jakiej jednostce organizacyjnej)
  • GivenName - Imie
  • Surname - Nazwisko
  • SamAccountName - Nazwa logowania użytkownika nazwadomeny\username, Powninna posiadać nie więcej niż 20 znaków!. Nazwa używana w serwerach starszych niż Windows 2000
  • UserPrincipalName - Nazwa logowania użytkownika ma format username@NazwaDomeny.com. Powinien być unikalny wśród wszystkich głównych obiektów zabezpieczeń w lesie.
  • DisplayName - Nazwa wyświetlana np.: "Marcin Szary"
  • Type - typ obiektu nu.: user, group ...
  • HomeDrive - literka dysku dla katalogu domowego (HomeDirectory) użytkownika
  • HomeDirectory - Ścieżka sieciowa do udziału udostępnionego np.: \\serwer\udział sieciowy$\ , znak $ oznacza że zasób był udostępniony jako ukryty
  • EmailAddress - adres poczty e-mail
  • Title - pozycja, funkcja przypisana danej osobie np.: dyrektor
  • Department - dział w którym pracuje dany użytkownik
  • Company - nazwa firmy
  • Identity - nazwa urzytkownika wraz z pełną scieszką identyfikującą jego lokalizacje w strókturze AD np.: "cn=marcin szary,cn=it,dc=szary,dc=pl"
  • MemberOf - przypisanie użytkownika do grupy 
  • password - hasło w tym wypadku wpisane do pliku *.csv czytym tekstem

 

UWAGA! podczas zakładania konta użytkowników ale i pewnie innych obiektów gdy używacie polskich znaków to NIESTETY o ile w nazwach wyświetlanych czy nazwach logowania jest ok to w nazwach wyróżnionych które używamy między innymi w skryptach pojawiają się błędy tzn. CZASEM znikają polskie znaki podczas tworzenia obiektu!
Przykład:
Name : Bogómiła Kożeńska
DistinguishedName : "CN=Bogmia Koeska,OU=Projekty,OU=Fabryka,DC=szary,DC=pl”
 
Niestety, również podczas przypisywania grup użytkowników do udziału sieciowego w wersjach Windows PL Windows Serwer należy się posługiwać nazwą grupy Twórca-Właściciel, natomiast w Angielskiej wersji systemu CREATOR OWNER.
10PowerShell Modyfikacja Użytkownika - Script

Skrypt powershell do resetowania wszystkim na domyślne hasło 

$csv=Import-Csv-Path"c:\skrypt\UserDane_pass.csv"-Delimiter";"

ForEach ($itemIn$csv)

{

#Zmiana hasła na domyślne dla wszystkich użytkowników 

#(oczywiście hasło w zależności jak stworzycie plik csv może mieś postać "H@sl.1269" np wyraz plus np dzień i miesiąc urodzi użytkownika) 

 

Set-ADAccountPassword -Identity $item.Identity -Reset-NewPassword (ConvertTo-SecureString -AsPlainText $item.Password -Force)

 

#Wymuszenie zmiany hasła podczas pierwszego logowania!

Set-ADUser -Identity $item.Identity -ChangePasswordAtLogon:$true

 

#Przypisanie użytkownikom grupy globalnej

Add-ADPrincipalGroupMembership -Identity $item.Identity -MemberOf $item.MemberOf

 

#Wymuszenie zabezpieczenia obiektu użytkownika przed przypadkowym usunięciem

Set-ADObject -Identity $item.Identity -ProtectedFromAccidentalDeletion:$true

 

#Przypisanie Menedżera Użytkownikom

Set-ADObject -Identity $item.Identity -Replace $item.Manager #DO POPRAWKI!!!!!

 

}  

 

_______________________________________________________________________________________________________________________________________________________________________

Plik odpowiedzi UserDane_pass.csv - 100, 1000, czy milion użytkowników nie ma znaczenia 🙂 :

Name;Identity;Password;MemberOf;Manager
Jan Kowalski;"CN=Jan Kowalski,OU=Chirurgia,OU=szpital,DC=szary,DC=pl";P@ssw0rd!;";"CN=Finance,OU=Chirurgia,OU=szpital,DC=szary,DC=pl";"CN=Marcin Szary,OU=szpital,DC=szary,DC=pl"
Ania Janicka;"CN=Ania Janicka,OU=Chirurgia,OU=szpital,DC=szary,DC=pl";P@ssw0rd!;";"CN=IT,OU=Chirurgia,OU=szpital,DC=szary,DC=pl";"CN=Marcin Szary,OU=szpital,DC=szary,DC=pl"
Tomek Mars;"CN=Tomek Mars,OU=Chirurgia,OU=szpital,DC=szary,DC=pl";P@ssw0rd!;";"CN=Kadry,OU=Chirurgia,OU=szpital,DC=szary,DC=pl";"CN=Marcin Szary,OU=szpital,DC=szary,DC=pl"


_______________________________________________________________________________________________________________________________________________________________________

Widok po zmianach z konsolu: Użytkownicy i Komputery Usług Active Directory:

#Wymuszenie zmiany hasła podczas pierwszego logowania!

zmiana

 

#Przypisanie użytkownikom grupy globalne

grupa

 

 

#Wymuszenie zabezpieczenia obiektu użytkownika przed przypadkowym usunięciem

usunięcie

 

 

UWAGA! podczas zakładania konta użytkowników ale i pewnie innych obiektów gdy używacie polskich znaków to NIESTETY o ile w nazwach wyświetlanych czy nazwach logowania jest ok to w nazwach wyróżnionych które używamy między innymi w skryptach pojawiają się błędy tzn. CZASEM znikają polskie znaki podczas tworzenia obiektu!
Przykład:
Name : Bogómiła Kożeńska
DistinguishedName : "CN=Bogmia Koeska,OU=Projekty,OU=Fabryka,DC=szary,DC=pl”
 
Niestety, również podczas przypisywania grup użytkowników do udziału sieciowego w wersjach Windows PL Windows Serwer należy się posługiwać nazwą grupy Twórca-Właściciel, natomiast w Angielskiej wersji systemu CREATOR OWNER.
11PowerShell Nowa Grupa - Script

Witam

Jeżeli przyjdzie Wam do utworzenia sporej ilości grup dodatkowo z kilkoma wybranymi atrybutami to chyba najwygodniej skorzystać z PowerShell oraz dobrodziejstw Excel'a (przeciąganie serii - inaczej mówić powielaniu pewnych komórek).

1. Należy przygotować plik *.CSV

Name;Path;Description;Managed;Mail;DName
Finance;"OU=Chirurgia,OU=szpital,DC=szary,DC=pl";Chirurgia;"CN=MarcinSzary,OU=DOM,DC=szary,DC=pl";"fis@szary.pl";"CN=Finance,OU=szpital,DC=szary,DC=pl"
IT;"OU=Chirurgia,OU=szpital,DC=szary,DC=pl";Chirurgia;"CN=MarcinSzary,OU=DOM,DC=szary,DC=pl";"its@szary.pl";"CN=IT,OU=szpital,DC=szary,DC=pl"

2. Plik Powershell *.ps1 najlepiej w PowerShell ISE

$csv = Import-Csv -Path "c:\groups.csv" -Delimiter ";"
ForEach ($item In $csv)
{
$create_group=New-ADGroup -Name $item.Name -Path $item.Path -Description $item.Description -ManagedBy $item.Managed -OtherAttributes:@{"mail"=$item.Mail} -GroupScope Global
Write-Host -ForegroundColor Green "Group $($item.GroupName) created!"
}

3. Na konec kolejny *.ps1 przy pomocy którego warto było by zmodyfikować parametr (włączyć)  zabezpieczenie przed przypadkowym usunięciem którego niestety nie da się dodać podczas tworzenia grup.

$csv = Import-Csv -Path "c:\groups.csv" -Delimiter ";"

ForEach ($item In $csv)

{
Set-ADObject -Identity $item.DName -ProtectedFromAccidentalDeletion:$true
Write-Host -ForegroundColor Green "Group $($item.GroupName) created!"
}

 

UWAGA! podczas zakładania konta użytkowników ale i pewnie innych obiektów gdy używacie polskich znaków to NIESTETY o ile w nazwach wyświetlanych czy nazwach logowania jest ok to w nazwach wyróżnionych które używamy między innymi w skryptach pojawiają się błędy tzn. CZASEM znikają polskie znaki podczas tworzenia obiektu!
Przykład:
Name : Bogómiła Kożeńska
DistinguishedName : "CN=Bogmia Koeska,OU=Projekty,OU=Fabryka,DC=szary,DC=pl”
 
Niestety, również podczas przypisywania grup użytkowników do udziału sieciowego w wersjach Windows PL Windows Serwer należy się posługiwać nazwą grupy Twórca-Właściciel, natomiast w Angielskiej wersji systemu CREATOR OWNER.
12EventLog BACKUP

    Skrypt Powershell uruchamiany według Harmonogramu np. raz w tygodniu. Kopiuje z serwerów wskazane logi z dziennika zdarzeń  na serwer docelowy (z którego jest uruchamiany poniższy skrypt) następnie czyści dzienniki zdarzeń. 

# Ustawienia zmiennych
$sourceServerName = "FS-04" # nazwa serwera źródłowego
$destinationServerNames = @("AD-01", "AD-02", "FS-01", "FS-02", "SQL-01") # nazwy serwerów docelowych
$logNames = @("Security", "Application", "System") # nazwy dzienników zdarzeń
$logFolder = "Z:\" # folder docelowy, w którym będą przechowywane pliki dzienników
$DateTime = Get-Date -Format "yyyy-MM-dd_HH-mm"

#Mapowanie dysku sieciowego (tylko w konsoli)
New-PSDrive -Name "Z" -PSProvider FileSystem -Root "\\fs-04\IT-Log"
Set-ItemProperty -Path "Z:\" -Name "Attributes" -Value ([System.IO.FileAttributes]::Hidden) #Ukrywa zamapowany dysk OPCJA

# Przetwarzanie dzienników dla każdego serwera docelowego
foreach ($destinationServerName in $destinationServerNames) {
# Łączenie z serwerem docelowym
$destinationSession = New-PSSession -ComputerName $destinationServerName

# Przetwarzanie dzienników dla każdego dziennika zdarzeń
foreach ($logName in $logNames) {
# Utworzenie nazwy pliku dziennika zdarzeń
$logFilePath = Join-Path -Path $logFolder -ChildPath "$destinationServerName\$logName-$DateTime.log"

# Pobieranie wpisów z dziennika zdarzeń z serwera źródłowego i zapisywanie ich do pliku
#$events = Get-EventLog -LogName $logName -ComputerName $sourceServerName
$events | Out-File -FilePath $logFilePath -Append

# Usuwanie wpisów z dziennika zdarzeń
Clear-EventLog -LogName $logName -ComputerName $sourceServerName
}

# Zakończenie sesji
Remove-PSSession -Session $destinationSession
}

#Odmontowanie Dysku Z
Remove-PSDrive -Name "Z"

13Polityka wyjątków Haseł -17.02.2023

Polityka haseł

Polityka działa według poniższego skryptu C:\APP\DeniedPasswords1.ps1, który dodaje wyjątek do polityki haseł za pomocą Fine-Grained Password.

Hasła muszą spełniać poniższe wymogi:

  • Hasło musi mieć długość co najmniej – 9 znaków
  • Co jakiś czas zmieniamy hasło – 50 dni
  • Historia haseł jest przechowywana przez – 24 zmiany
  • Interwał zmiany haseł nie częściej niż – 2 dni
  • Blokada konta po próbie wprowadzenia nieprawidłowego hasła – 8
  • Czas blokady – 15 min
  • Lista zabronionych haseł - C:\APP\DeniedPasswords.txt

UWAGA:

Aby zmienić/dodać do polityki nowe zabronione hasło należy wy edytować plik DeniedPasswords.txt a następnie ponownie (najlepiej na każdym kontrolerze domeny) uruchomić skrypt C:\APP\DeniedPasswords1.ps1 ręcznie

 
DeniedPasswords1.ps1:
# Import modułu ActiveDirectory
Import-Module ActiveDirectory
# Nadanie nazwy skrypt
$scriptName = "DeniedPasswords1.ps1"
# lokalizacja na dysku skryptu
$scriptPath = "C:\skrypty\DeniedPasswords1.ps1"
# Utworzenie skryptu
Set-Content -Path $scriptPath -Value @"
Import-Module ActiveDirectory
# Definicja ustawien polityki hasel
$policyName = "PolicyName"
$policyPrecedence = 1
$policyComplexityEnabled = $true #włączenie skomplikowalność hasel
$policyLength = 9 #minimalna dlugosc hasla
$policyHistoryCount = 24    #czas przechowywania haseł raz uzytych przez urzytkownika w miesiacach
$policyLockoutThreshold = 8  #ilosc nieprawidlowych prob zalogaowania
$policyLockoutDuration = (New-TimeSpan -Minutes 15) #Czas blokady
$policyLockoutObservationWindow = (New-TimeSpan -Minutes 30)
$policyAllowedUserGroups = @("CN=PasswordList,OU=jednostka organizacyjna,DC=nazwa-domeny,DC=local") #grupa uzytkownikow ktorej dotyczy wyjatek
$policyDeniedPasswordsFile = "C:\APP\DeniedPasswords.txt" #plik tekstowy z zabronionymi haslami
$policyDeniedPasswords = Get-Content $policyDeniedPasswordsFile
$policyMinPasswordAge = (New-TimeSpan -Days 2) #minimalny czas po jakim czasie mozna ponowniezmienic haslo
$policyMaxPasswordAge = (New-TimeSpan -Days 50) #wymog zmiany haesal po x dniach
# Tworzenie wyjatku polityki - fine-grained password policy
New-ADFineGrainedPasswordPolicy
-Name $policyName
-Precedence $policyPrecedence
-ComplexityEnabled $policyComplexityEnabled
-MinPasswordLength $policyLength
-PasswordHistoryCount $policyHistoryCount
-LockoutThreshold $policyLockoutThreshold
-LockoutDuration $policyLockoutDuration
-LockoutObservationWindow $policyLockoutObservationWindow
-DeniedPasswordList $policyDeniedPasswordsFile
-MinPasswordAge $policyMinPasswordAge
-MaxPasswordAge $policyMaxPasswordAge
-AllowedGroups $policyAllowedUserGroups
"@
 
 
Plik tekstowy z listą zabronionych haseł DeniedPasswords.txt:
Baseball1#
Mustang123!
Polska1!
Jezus123!
Harley123!
Witaj123#
123456qwerty!
1q2w3e4r5t!
Internet123!
Gwiezdnewojny1!
123456789a!
123123qwe!
Kacper123!
Myszka123!
Superman1!
Piłkanożna123!
Haslo12!
 
1Przedłużenie certyfikatu LAB 10 szkolenie MS 10969

2EXCH2019-BACKUP

Wycinek Labolatorium ze szkolenie Exchange 2019

Filmiki zostały podzielone na 3 części

1. Backing up an Exchange Server mailbox database - FILM#1


Wycinek Labolatorium ze szkolenie Exchange 2019

Filmiki zostały podzielone na 3 części

1. Backing up an Exchange Server mailbox database - FILM#1

Populate a mailbox by using Microsoft Outlook on the web

Install Windows Server Backup

Perform a backup of a mailbox database by using Windows Server Backup

2. Restoring an Exchange Server mailbox - FILM#2

Delete a message in a mailbox

Restore the database by using Windows Server Backup

3. Create a recovery database with the Exchange Management Shell - FILM#3

Recover the mailbox from the recovery database

  • Populate a mailbox by using Microsoft Outlook on the web
  • Install Windows Server Backup
  • Perform a backup of a mailbox database by using Windows Server Backup

2. Restoring an Exchange Server mailbox - FILM#2

  • Delete a message in a mailbox
  • Restore the database by using Windows Server Backup

3. Create a recovery database with the Exchange Management Shell - FILM#3

  • Recover the mailbox from the recovery database
3Czasowa aktywacja Office

LAB EX

  • Pamiętajcie aby najpierw uruchomić AD a jak wstanie uruchamiamy EX!!!!

Można przedłużyć czas pracy na office 20xx to testów.

Uruchamiamy Command Prompt jako Administrator

wprowadzamy polecenia:

cd \

cd c:\Program Files\Microsoft Office (x86)\Office16

cscript ospp.vbs /rearm

4NanoServer - szybka instalacja
5AD serwis user

W załączniku przedstawiam filmik który przedstawia w jaki sposób utworzyć w Active Directory konto serwis które w domenie będzie kontem zwykłego użytkownika natomiast na stacji roboczej będzie miało podwyższone uprawniania do Administratora lokalnego. Dzięki czemu można wykonywać czynności związane z np czynności związane z instalacją oprogramowania i wiele innych które wymagają wyższych poświadczeń.

6GPO Skróty

Zapraszam do obejrzenia poglądowego filmiku, jak szybko utworzyć skróty do jakichkolwiek zasobów np. do strony www na pulpicie, dla wielu użytkownikom przy pomocy GPO:

Po zalogowaniu użytkownika na innym komputerze skróty również się pojawią. 

Skróty - konfiguracja w ADDS GPO.

7ADDS - wyjątki haseł

Poltyka haseł którą możemy skonfigurować w GPO powinna być jedyną która jest stosowana w domenie. Jest natomiast możliwość wprowadzania wyjątków do polityki GPO.

Zapraszam od obejrzenia filmu:

8Drukowanie terminalowe

Przekierowanie drukarki lokalnej do serwera terminali bez instalowania serowników na tej drukarce:

1. konfigurujemy plik printer.inf (według wzoru) i zapisujemy go np.: c:\

[Version]

Signature="$Gdynia$"

[Printers]

"hp photosmart 7600 series"="HP LaserJet 2300 Series PS"

"Apple Color LW 12/660 PS"="HP LaserJet 2300 Series PS"

"Brother HL-4150CDN series"="HP LaserJet 2200 Series PCL 5"

"Brother MFC-5460CN Printer"="HP LaserJet 2200 Series PCL 5"

"Canon GP300-405 PCL"="HP LaserJet 2200 Series PCL 5"

2. Dodajemy wpisy w rejestrze:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd]
"PrinterMappingINFName"="c:\\printer.inf"
"PrinterMappingINFSection"="Printers"

9Licencje terminalowe

Uzyskanie kolejnych 180 dni licencji tymczasowych dla serwera terminali

artykuł: https://support.microsoft.com/pl-pl/kb/187614

 

Każdy klient serwera terminali uzyskuje licencję przy pierwszym połączeniu z serwerem terminali. Klient łączy się używając tej licencji do czasu jej wygaśnięcia. Licencja jest przechowywana w Rejestrze klienta. 

Kroki potrzebne do wykonania na komputerze KLIENTA 

1. uruchamiamy narzędzie: regedit

2. przechodzimy do: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSLicensing

3. Kasujemy 2 klucze: Store i HardwareID

 

Informacja ma na celu pokazanie możliwości wykonania takiej czynności w raznie niedostarczenia na czas licencji przez dystrybutora lub innych losowych przypadków 😉 Informacje podobne można znaleść w wielu miejscach internetu więc pozwólcie iż nie będę podawać bibliografi hehe;)

Należy tutaj zaznaczyć że takie czynności są niezgodne z polityką licencjonowania Microsoft i może prowadzić do nałożenia kar przez firme Microsoft!!!

Za szkody wyżądzone w waszych systemach (a takie mogą się zdażyć po przez nieprawidłowe grzebanie w rejestrze) nie odpowiadam hehehehe 😉

 

Owocnych testów 🙂

10EXCHANGE 2013 Perform a dial tone recovery

EXCHANGE 2013

1. OPIS

2. PROCEDURA

11Labolatorium Wndows serwer 200x

W ramach tego labolatorium przechodimy przez kolejne kroki konfiguracji uprawnień NTFS dla serwera plików oraz ustawienia przykładowych polityk GPO, a także instalacjię i konfiguracje roli RIS. Życzę miłej zabawy.

Labolatorium opiera się osystem Windows 2003 Serwer natomiast jest aktualna dla wszystkich kolejnych serwerów.

Labolatorium w formacie - PDF

Usługa WDS - usługa RIS w systemach od Windows 2008 została zastąpiona usługą WDS która jest opisana przez Jacka Światowiaka na Technecie.

12Program narzędziowy do konserwacji usług katalogowych usługi Active Directory (ntdsutil.exe)

Program narzędziowy do konserwacji usług katalogowych usługi Active Directory (ntdsutil.exe)

Procedura usuwania nieistniejącego (uległ awarii) kontrolera który pełnił role FSMO wygląda tak:

ntdsutil- wchodzimy do zarzšdzania rolami
Roles - zarzšdzanie rolami kontrolerów domeny
najpierw podłanczamy sie do sprawnego kontrolera domeny
Connections
Connect to domain domain.local
quit
Wybieramy cel operacji i podłanczamy sie do domeny, serwera itd
fsmo maintenance: Select operation target
select operation target: List Domains
select operation target: select domain 0
Listujemy sit-y i podłanczamy sie pod domyslnego
select operation target: List sites
Lokacji odnalezionych: 1
select operation target: select site 0
select operation target: List naming contexts
select operation target: List servers for domain in site
Serwerów odnalezionych: ?
select operation target: select server 3 (wybieramy dobry)
quit
Wychodzimy do zarzadzania rolami FSMO i robimy size dla wszystkich ról
fsmo maintenance: Seize schema master
fsmo maintenance: Seize RID master
fsmo maintenance: size pdc
fsmo maintenance: Seize naming master
Wyłączamy wykaz globalny na serwerze na którym chcemy przenieœć wzorzec infrastruktury
fsmo maintenance: Seize infrastructure master
Etap II - usuniecie uszkodzonego kontrolera domeny
C:\Windows\system32\ntdsutil.exe: Metadata cleanup
metadata cleanup:
podłanczamy sie do sprawnego kontrolera 
metadata cleanup: connections
server connections: connect to server ad02
quit
metadata cleanup: Select operation target
select operation target:
select operation target: list domains
select operation target: select domain 0
select operation target: list sites
select operation target: select site 0
select operation target:
select operation target: list servers in site
2 - CN=AD01(uszkodzony),CN=Servers,CN=Default-First-Site- select operation target: select server 2
usuwamy uszkodzony server
select operation target: quit
metadata cleanup: remove selected server
usuwamy wpisy w DNS dla każdej strefy wskazującej na inne ( usunięte serwery nazw ) 

 

Informacje na temat narzędzia  NTDSUTIL można zanleść:

http://technet.microsoft.com/pl-pl/library/cc758526(v=ws.10).aspx

13Rundll32.exe np: książka tel w ADDS

Interfejs Rundll i Rundll32 w systemie Windows

Streszczenie:

Systemy Microsoft Windows od 95, Windows 98 i Windows Millennium Edition (Me) zawieraja dwa programy

narzedziowe wiersza polecenia, Rundll.exe i Rundll32.exe, które umo)liwiaja wywołanie funkcji wyeksportowanej z

biblioteki DLL, czy to 16-bitowej, czy to 32-bitowej. Jednak programy Rundll i Rundll32 nie pozwalaja na wywołanie

ka)dej funkcji wyeksportowanej z ka)dej biblioteki DLL. Nie mo)na na przykład u)yc tych programów narzedziowych

do wywołania funkcji interfejsu programowania aplikacji (API) Win32 wyeksportowanej z systemowej biblioteki DLL.

Programy te umo)liwiaja wywoływanie z biblioteki DLL tylko tych funkcji, które napisano specjalnie z mysla o

wywoływaniu ich przez te programy. W artykule podano wiecej szczegółów dotyczacych korzystania z programów

Rundll i Rundll32 w systemach operacyjnych Windows wymienionych powy)ej.

Systemy Microsoft Windows NT 4.0, Windows 2000 ... 8.1.i Windows 2012R2 sa dostarczane tylko z programem Rundll32. W

przypadku )adnej z tych platform nie jest dostepna pomoc techniczna dla programu Rundll (narzedzie Win16).

Programy narzedziowe Rundll i Rundll32 zaprojektowano poczatkowo tylko do wewnetrznego u)ytku firmy Microsoft.

Jednak zapewniane przez nie funkcje sa na tyle uniwersalne, )e obecnie sa one dostepne do u)ytku ogólnego.

Nale)y zwrócic uwage, )e system Windows NT 4.0 jest dostarczany tylko z programem narzedziowym Rundll32 i

obsługuje wyłacznie ten program.

 Wiecej informacji

Rundll a Rundll32

Program Rundll ładuje i uruchamia 16-bitowe biblioteki DLL, podczas gdy program Rundll32 ładuje i uruchamia 32-

bitowe biblioteki DLL. Jesli do programu Rundll lub Rundll32 zostanie przekazany niewłasciwy typ biblioteki DLL,

mo)e on sie nie uruchomic, nie wyswietlajac )adnego komunikatu o błedzie.

 Wiersz polecenia Rundll

Wiersz polecenia dla programu Rundll wyglada nastepujaco:

 

• Rundll32.exe dsquery, OpenQueryWindow – uruchamia okno: Znajdowanie: w Activ Directory (LDAP) –

utworzenie skrótu na pulpicie: c:\Windows\system32\rundll32.exe Dsquery, OpenQueryWindow

Można stosować również jako książkę telefoniczną w ramach ADDS. Użytkownicy domeny mają prawo zmieniać atrybuty tylko dotyczące ich kont.

______

• Rundll32.exe desk.cpl,InstallScreenSaver - wyswietla okno wygaszacza ekranu

• Rundll32.exe diskcopy,DiskCopyRunDLL - wyswietla okno dialogowe kopiuj dysk

• Rundll32.exe exekrnl386.exe,GlobalrealLoc - przerwanie wszystkich funkcji systemowych

• Rundll32.exe krnl386.exe,ExitKernel - zamkniecie sesji kernela (szybkie zamkniecie systemu)

• Rundll32.exe mouse,disable - powoduje zablokowanie myszki

• Rundll32.exe keyboard,disable - powoduje zablokowanie klawiatury

• Rundll32.exe msprint2.dll,RUNDLL_PrintTestPage - powoduje wydrukowanie strony testowej

• Rundll32.exe shell,shellexecute - otwiera okno Eksploratora

• Rundll32.exe shell32.dll,Control_RunDLL – otwiera Panel Sterowania

• Rundll32.exe shell32.dll,Control_RunDLL main.cpl @0 - wyswietla okno własciwosci myszy

• Rundll32.exe shell32.dll,Control_RunDLL main.cpl @1 - wyswietla okno własciwosci klawiatury

• Rundll32.exe shell32.dll,Control_RunDLL main.cpl @2 - wyswietla okno własciwosci drukarek

• Rundll32.exe shell32.dll,Control_RunDLL main.cpl @3 - wyswietla okno własciwosci czcionek

• Rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl - wyswietla okno własciwosci systemu

• Rundll32.exe shell32.dll,OpenAs_RunDll - wyswietla okno dialogowe Otwórz z...

•  Rundll32.exe shell32.dll,ShellAboutA - informacja o pamieci fizycznej i zasobach

•  Rundll32.exe shell32.dll,SHexitWindowsEX 0 - powoduje wylogowanie z Windows

•  Rundll32.exe shell32.dll,SHexitWindowsEX 1 - zamyka Windows

•  Rundll32.exe shell32.dll,SHexitWindowsEX 2 - restartuje Windows

•  Rundll32.exe shell32.dll,SHexitWindowsEX 3 - restartuje powłoke Windows

•  Rundll32.exe shell32.dll,SHFormatDrive - wyswietla okno formatowania dysku

•  Rundll32.exe user,disableoemlayer - wyłacza grafike Windows

•  Rundll32.exe user,enableoemlayer - włacza grafike Windows

•  Rundll32.exe user,exitwindows - wychodzi z Windows

•  Rundll32.exe user,repaintscreen - odswie)a ekran

•  Rundll32.exe user,setcaretblinktime [n] - ustawia szybkosc migania Windows

•  Rundll32.exe user,setdoubleckilcktime [n] - ustawia szybkosc dwukrotnego klikniecia myszka

•  Rundll32.exe User,setcursorpos - przesuwa kursor w lewy górny róg ekranu (pozycja 0, 0)

•  Rundll32.exe user,swapmousebutton - zamienia klawisze myszki

•  Rundll32.exe user,tilechildwindows - wyswietla okna w rzedzie

•  Rundll32.exe user,cascadechildwindows - wyswietla okna kaskadowo

•  Rundll32.exe user,wnetdisconnectdialog - wyswietla okno dialogowe "odłacz dysk sieciowy”

•  Rundll32.exe user.exe,MessageBeep - odtwarza dzwiek Beep (z głosniczka sys)

•  Rundll32.exe shell32.dll,Control_RunDLL datetime.cpl - wyswietla okno ustawien daty i czasu

•  Rundll32.exe shell32,Control_RunDLL powercfg.cpl - wyswietla okno zarzadzania energia

•  Rundll32.exe sysdm.cpl,InstallDevice_Rundll - wyswietla okno kreatora dodawania nowego sprzetu

•  Rundll32.exe shell32.dll,Control_RunDLL joy.cpl - wyswietla okno kontrolerów gry

•  Rundll32.exe shell32.dll,Control_RunDLL desk.cpl - wyswietla okno własciwosci ekranu

•  Rundll32.exe shell32,Control_RunDLL sticpl.cpl - wyswietla okno własciwosci drukarek

•  Rundll32.exe shell32,Control_RunDLL intl.cpl - wyswietla okno ustawien regionalnych

•  Rundll32.exe shell32,Control_RunDLL sysdm.cpl - wyswietla okno własciwosci systemu

 

Błedy Rundll

Je)eli po starcie Windows ka)dorazowo jest sygnalizowany ten sam bład Rundll, powinna pomóc nastepujaca

procedura postepowania: otwieramy Edytor rejestru poleceniem Regedit i szukamy nastepujacego klucza:

HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Run. Nastepnie wybieramy w prawej czesci

okna komunikat, który jest wyswietlany w oknie informujacym o błedzie i usuwamy go. Komunikat nie pojawi sie ju)

wiecej.

Czy plik rundll32.exe może być wirusem?

Plik rundll32.exe mo)e byc zara)ony wirusem i wtedy trzeba go odtworzyc z kopii zapasowej lub płytki

instalacyjnej. Przyjrzyjmy sie jednak przypadkowi, gdy rundll32.exe jest nienaruszony a mimo to istnieje podejrzenie,

)e jest wykorzystywany przez wirusa. Poniewa) rundll32.exe potrafi uruchamiac inne programy (a własciwie funkcje

z bibliotek), czesto jest wykorzystywany przez wirusy. Np. mo)na spotkac w autostarcie plik rundll32.exe

wywoływany z dwoma parametrami: biblioteka zawierajaca wirusa i nazwa funkcji uruchamiajacej wirusa. Tak

 uruchomiony wirus jest widoczny na liscie procesów jako rundll32.exe  co uspokaja u)ytkownika, który jest

przeswiadczony, )e proces ten jako systemowy jest bezpieczny. Co wiec zrobic, gdy widzimy rundll32.exe  na liscie

procesów? Nale)y najpierw sprawdzic, czy rzeczywiscie mamy do czynienia z plikiem systemowym Windows.

Standardowo jest on w podkatalogu system32  w Windows z linii NT albo w System  w starych Windows. Jesli

uruchomiony plik rundll32.exe  pochodzi z innej scie)ki, nale)y podejrzewac, )e jest to wirus. Jak sprawdzic scie)ke?

Najlepiej programem Process Explorer . Program ten poka)e te) inna wa)na rzecz: parametry uruchomienia. Dzieki

temu mo)emy sie dowiedziec jaka biblioteka została załadowana i jaka funkcja uruchomiona. Jesli dana biblioteka

nie jest biblioteka systemowa ani nie nale)y do zainstalowanego przez nas programu, prawdopodobnie jest to wirus.

W celu upewnienia sie nale)y skorzystac z Google. Jesli stwierdzimy, )e program rundll32.exe  uruchomił wirusa,

nale)y zabic jego proces a nastepnie skasowac biblioteke (DLL, CPL itp). Po usunieciu wirusa mo)na skasowac jego

ewentualny wpis z autostartu.

Dodatkowe materiały (bibliografia):

.

.

http://www.grzegorz.net/articles/

14Ukrywanie danych w wielokrotnych strumieniach plików NTFS

System plików NTFS posiada wiele ciekawych a mało znanych funkcji. Jedną z nich są alternate data streams, tłumaczone jako wielokrotne lub alternatywne strumienie danych. O co w nich chodzi? Otóż każdy plik na partycji NTFS, obojętnie czy jest zwykłym plikiem czy katalogiem, posiada główny (nienazwany, unnamed) strumień, w którym zapisane są informacje, które przechowuje. To to jest to, co widzimy jak otwieramy plik. Plik może posiadać jednak więcej strumieni i można w nich przechowywać dane tak jak w normalnych plikach. Nie różnią się bowiem one niczym od nienazwanego strumienia oprócz tego, że mają nazwy. Jak się dostać do strumienia? Jest to całkiem proste: tak samo jak do pliku, z tym, że po nazwie pliku wpisujemy dwukropek i nazwę strumienia, np.:

plik.txt:plik.avi. Widzimy tu strumień plik.avi w pliku plik.txt.
Jak utworzyć strumień i coś do niego zapisać? Np. przekierowując wyjście polecenia echo:
echo abc > plik.txt:str
Jeśli plik.txt nie istniał, zostanie utworzony, a w nim strumień str zawierający sześć bajtów: literki abc, spację oraz znaki CR i LF oznaczające przejście do nowej linii. Jak teraz odczytać dane z pliku? Można użyć polecenia more:
more < plik.txt:str
Można też skorzystać z Notatnika:
notepad plik.txt:str
Ups, Notatnik mówi, że plik nie istnieje. Nie jest to jednak problem ze strumieniem a błąd w Notatniku, który wymaga rozszerzenia .txt. Dajmu więc mu je:
echo abc > plik.txt:str.txt
notepad plik.txt:str.txt
Teraz działa 🙂 Możemy spróbować otworzyć nasz strumień w innym programie. Jeśli jest dobrze napisany to sobie poradzi. Problemy mogą być bo niewielu programistów wie o czymś takim jak dodatkowe strumienie danych. Np. nie można skopiować pliku do strumienia lub na odwrót poleceniem copy. W przypadku plików tekstowych można sobie poradzić poleceniem more:
more < plik.txt:str > drugi_plik.txt
skopiuje strumień str z pliku plik.txt do pliku drugi_plik.txt
more < drugi_plik.txt > plik.txt:str
skopiuje drugi_plik.txt do strumienia str w plik.txt.
Jedyny znany mi sposób na skopiowanie pliku binarnego do strumienia i na odwrót to wykorzystanie windowsowego portu uniksowego polecenia cp:
cp film.avi plik.txt:film
cp plik.txt:film film.avi
Wiemy już mniej więcej jak działają strumienie. Jak je można wykorzystać do ukrywania danych? Po prostu zapisując dane do strumienia nie zostawiamy praktycznie żadnychśladów. Nie można narzędziami dostępnymi w Windowsie stwierdzić, że w pliku są jakieś strumienie. Wielkość pliku pokazywana przez polecenie dir, Eksplorator Windows czy inne programy nie zmienia się. Zmniejsza się jedynie ilość wolnego miejsca na dysku co jest oczywiste. Poza tym strumienie można tworzyć w katalogach! Zobaczmy przykład:
mkdir katalog
echo abc > katalog:plik.txt
notepad katalog:plik.txt
Stworzyliśmy strumień w katalogu. To jest strumień a nie plik więc jak wejdziemy do tego katalogu to nic nie zobaczymy. Dla wielu osób takie coś będzie zadziwiające ale należy pamiętać, że dodatkowe strumienie są wspierane przez NTFS od ponad 10 lat. Po prostu mało osób o nich wie. Bardziej są znane przez użytkowników Maców. Pod Windows prawie nikt nie ma o nich pojęcia i dlatego są tak fajnym sposobem na ukrywanie danych, np. przed administratorem. Administrator, ponieważ ma pełne uprawnienia, może nam skasować plik wraz ze strumieniem ale skąd będzie wiedzieć, że tam jest jakiś strumień?
No właśnie, skąd mamy wiedzieć, że w jakimś pliku albo katalogu są dodatkowe strumienie? Windows nam w żaden sposób tego nie powie, trzeba użyć zewnętrznych programów. Znam takie dwa: LADS oraz Streams. Są to proste konsolowe programy pokazujące istniejące strumienie i pozwalające je kasować.
Obsługę wielokrotnych strumieni danych wprowadzono w Windows NT dla zgodności z Macami. Przez długi czas nie miały innego zastosowania w systemie. Począwszy do Windows 2000 w okienku właściwości pliku obecna jest zakładka Podsumowanie, w której możemy zapisać autora, tytuł itp. Informacje te są zapisywane w strumieniuSummaryInformation, przed literą S jest jeszcze znak niedrukowalny. W Windows XP SP2 dodano funkcję ostrzegajacą przed uruchamianiem plików ściągniętych z Internetu. IE przy ściąganiu pliku i OE przy zapisie załącznika dodają strumień Zone.Identifier. Explorer (w przeciwieństwie np. do cmd.exe) po wykryciu w tym strumieniu wpisuZoneID=3 (lub więcej) ostrzega przed otwarciem pliku jako potencjalnie niebezpiecznego.

Strona Grzegorza Niemierowskiego

15Odzyskanie HASŁA w Windows 2008 / 2008 R2 ADDS

Wyobraźmy sobie sytuacje w której przejmujecie administrowanie środowiskiem opartym na Windows 2008 /2008R2 ADDS bez znajomości hasła Administratora ponieważ poprzedni administrator tak owego hasła Wam nie przekazał!!! Niestety inne możliwość zostały tutaj przyblokowane na przykład wyciągniecie hasła Administratora z pliku SAM tutaj nie zadziała ponieważ plik lokalnej bazy danych jest zaszyfrowany poza tym ta metoda działała pod warunkiem że Administrator AD nie zmienił hasła od czasów instalacji Windows Serwer co było możliwe ale dla systemu Windows 2003 i wcześniej.

Zmiana hasła administratora w Kontrolerze Domeny opartym na Systemie Windows 2008 oraz Windows 2008 R2 bez jego znajomości i bezpośredniego dostępu do konsoli administracyjnej Windows, natomiast z fizycznym dostępem do Serwera.

No to do dzieła:

Krok 1.

Uruchamiamy komputer z płytki instalacyjnej Windows 2008 / Windows 2008 R2

Krok 2.

W oknie wyboru języka klikamy DALEJ

Krok 3.

Wybierz partycję na której jest zainstalowany System Operacyjny (Windows 2008 Serwer)

Krok 4.

W następnym oknie wybierze opcje umożliwiającą uruchomienie wiersz poleceń CMD

Krok 5.

Będąc na dysku C: przechodzimy do katalogu c:\windows\system32 . następnie

Za pomocą polecenia COPY zmień nazwę pliku UTILMAN.EXE na UTILMAN.EXE.old: 
copy utilman.exe utilman.exe.old

Za pomocą polecenia MOVE przenieś plik CMD.EXE wraz ze zmianą nazwy na plik UTILMAN.EXE
move cmd.exe utilman.exe

Krok 6.

Potwierdź powyższe polecenia wybierając odpowiednio Y za nim wykonasz restart systemu. Wyciągnij nośnik z instalacją Windows 2008 tak aby system nie uruchomił się z napędu DVD

Krok 7.

Zanim wprowadzisz login oraz hasło na oknie logowania do systemu wciśnij przyciski z logiem Windows + U, następnie w konsoli CMD wpisz polecenie zmiany hasła 
net user „Username” „new password” 
Po wykonaniu czynności na koncie Administratora możesz się zalogować na niego ze swoim nowym hasłem.

Pamiętaj abyś to Ty nie zapomniał przekazać hasła Administratora swojemu następcy J

Krok 8.

Wykonaj polecenia odwracające zmiany które wykonałeś w kroku 5. Nie odwrócenie zmian znacząco osłabia poziom bezpieczeństwa Twojego systemu!

Miłych testów i odzyskiwania dostępu do Windows Serwer 2008 2008 R2 ADDS

W najbliższym czasie dołączę do artykułu zrzuty ekranu poszczególnych kroków.

Artykuł napisany na podstawie: http://www.articlesbase.com/security-articles/how-to-reset-windows-server-2008-dc-password-4359749.html#ixzz1Ubff90bY