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
Najlepiej za pomocą PowerShell 7
Pola zaznaczone na zielono EDYTUJEMY
Skrypt pobiera informacje o wielkości zajętego i wolnego miejsca na dysku, oraz jeżeli wartość wolnej przestrzeni spadnie poniżej ustalonej w skrypcie to wpis w tabeli zmienia kolor na czerwony.
________________________________________________________
# BY Marcin Szary http://www.szary marcin@szary.pl
# Created 02.01.2020
# Przetestowane w PowerShell 7.4.1
# Konfiguracja danych e-mail
$Hostname = (Get-WmiObject Win32_ComputerSystem).Name
$emailFrom = "ma@test.pl"
$emailTo = @("alerty@testy.pl", "ma@test.pl")
$subject = "Pojemność dysków na serwerze $Hostname"
$smtpServer = "smtp.test.pl"
$smtpPort = 587
$smtpUsername = "ma@testy.pl"
$smtpPassword = "password"
# Pobranie informacji o dyskach C:, D: i E:
$drives = Get-WmiObject -Class Win32_LogicalDisk -Filter "DriveType=3 AND DeviceID='C:' OR DeviceID='E:' "
# Tworzenie tabeli HTML z informacjami o dyskach
$htmlTable = "<table border='1'><tr><th>Nazwa dysku</th><th>Dysk</th><th>Wolne miejsce (GB)</th><th>Zajęte miejsce (GB)</th></tr>"
foreach ($drive in $drives) {
$freeSpaceGB = [math]::Round($drive.FreeSpace / 1GB, 2)
$usedSpaceGB = [math]::Round(($drive.Size - $drive.FreeSpace) / 1GB, 2)
$driveName = ""
switch ($drive.DeviceID) {
"C:" { $driveName = "System" }
"E:" { $driveName = "SQL, BACKUP" }
default { $driveName = "Nieznany dysk" }
}
$htmlTable += "<tr><td>$driveName</td><td>$($drive.DeviceID)</td><td>$freeSpaceGB</td><td>$usedSpaceGB</td></tr>"
}
$htmlTable += "</table>"
# Tworzenie treści e-maila
$body = "<h2>Pojemność dysków na serwerze $Hostname</h2>$htmlTable"
# Konfiguracja parametrów wysyłania e-maila
$smtp = New-Object Net.Mail.SmtpClient($smtpServer, $smtpPort)
$smtp.EnableSSL = $false
$smtp.Credentials = New-Object System.Net.NetworkCredential($smtpUsername, $smtpPassword)
# Wysłanie e-maila na każdy adres osobno
foreach ($recipient in $emailTo) {
$mailMessage = New-Object System.Net.Mail.MailMessage($emailFrom, $recipient, $subject, $body)
$mailMessage.IsBodyHtml = $true
$smtp.Send($mailMessage)
}
Write-Host "E-mail został wysłany z informacjami o pojemności dysków."
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:
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!!!
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 lokalny, dysk 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ć.
7. Oczywiście należy zainstalować PowerShell 7.x lub nowszy i moduły do obsługi 7zip...
Jeżeli są jakieś pomysły to poproszę o Wasze wersje 😉 na: email
__________________________________________________
# BY Marcin Szary http://www.szary.pl marcin@szary.pl
# modyfy 12.03.2024
# Przetestowane w PowerShell 7.4
# 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
#Install-Module -Name Transferetto -AllowClobber -Force # Transfertto is a new PowerShell module that supports both FTPS and SFTP protocols
#Zmienne
$ServerInstance = "OPTIMA2022\SQLEXPRESS"
$Database = ''CDN_Ma_Sp_','CDN_KNF_Konfiguracja','OPTIMA_BI_META' ;
$Destenation = "C:\APP_BACKUP"
$DestArchiwum = "E:\archiwum"
$Dest_Arch_HV01 = "\\Ma-hv-01\sql\"
$UserAndDomain = "root"
$pass = "password"
$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
# Zmienne - możesz ich użyć w temacie i treści wiadomości e-mail
$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
# Definiowanie zmiennych e-mail
$subject = "Informacja! MA, Kopia SQL Server wykonana."
$smtpServer = "smtp.test.pl"
$smtpPort = 587
$username = "test@test.pl"
$password = "password"
$from = "ma@test.pl"
$to = @("alerty@testowy.pl", "ma@test.pl")
#Call SQL Command--------------------------------------------------------------------------------------
foreach ($dbname in $Database) {
Backup-SqlDatabase -ServerInstance $ServerInstance –Database $dbname -BackupFile "$Destenation\$dbname.bak" -PassThru
}
#ZIP Kompresja plików *.bak do *.7z-------------------------------------------------------------------
Compress-7Zip -Path C:\APP_BACKUP\CDN_Ma_Sp.bak -ArchiveFileName $Destenation\CDN_Ma_Sp$DateTime.7z -Format SevenZip
Compress-7Zip -Path C:\APP_BACKUP\CDN_Ma_Sp_.bak -ArchiveFileName $Destenation\CDN_Ma_Sp_$DateTime.7z -Format SevenZip
Compress-7Zip -Path C:\APP_BACKUP\CDN_KNF_Konfiguracja.bak -ArchiveFileName $Destenation\CDN_KNF_Konfiguracja_$DateTime.7z -Format SevenZip
Compress-7Zip -Path C:\APP_BACKUP\OPTIMA_BI_META.bak -ArchiveFileName $Destenation\OPTIMA_BI_META_$DateTime.7z -Format SevenZip
#Usówanie plików *BAK
Remove-Item "C:\APP_BACKUP\*.bak"
#Kopia na dysk D:\archiwum oraz Serwer NAS
Copy-Item -Path "C:\APP_BACKUP\*.7z" -Destination "$DestArchiwum" -recurse -Force
Copy-Item -Path "C:\APP_BACKUP\*.7z" -Destination "$Dest_Arch_HV01" -recurse -Force
#Wysyłania na serwer FTP-------------------------------------------------------------------
$Client = Connect-FTP -Server 'xxx.xxx.xxx.xx' -port '2121' -Verbose -Username 'backup_ma' -Password 'password'
# List files-------------------------------------------------------------------
$List = Get-FTPList -Client $Client
$List | Format-Table
# List files within Temporary directory
$List = Get-FTPList -Client $Client -Path '/MA/SQL'
$List | Format-Table
# Get local files-------------------------------------------------------------------
$ListFiles = Get-ChildItem -LiteralPath C:\APP_BACKUP
# Upload file by file-------------------------------------------------------------------
foreach ($File in $ListFiles) {
Send-FTPFile -Client $Client -LocalPath $File.FullName -RemotePath "/MA/SQL/$($File.Name)" -RemoteExists Overwrite
}
Disconnect-FTP -Client $Client
#Usuwanie plików C:\APP_BACKUP\ .*7Z-------------------------------------------------------
Get-ChildItem –Path $Destenation -Recurse | Where-Object { ($_.LastWriteTime -lt (Get-Date).AddDays(0)) } | Remove-Item
#Usówanie plików starszych niz 10 dni D:\archiwum .*7Z-------------------------------------------------------
Get-ChildItem –Path $DestArchiwum -Recurse | Where-Object { ($_.LastWriteTime -lt (Get-Date).AddDays(-5)) } | Remove-Item
Get-ChildItem –Path \\Ma-hv-01\sql\ -Recurse | Where-Object { ($_.LastWriteTime -lt (Get-Date).AddDays(-10)) } | Remove-Item
#Liczba plikow w folderach archiwum
$numFiles = (Get-ChildItem -Path $DestArchiwum -File).Count
# Pobranie listy plikow z wybranej sciezki
$files = Get-ChildItem $DestArchiwum
# Rozpoczecie tworzenia tabelki HTML
$htmlfile = "<table><tr><th>Nazwa pliku</th><th>Wielkosc pliku w MB</th></tr>"
# Dla kazdego pliku w liscie 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>"
}
# 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)
# Zakończenie tworzenia tabelki HTML
$body = @"
<html>
<head>
<h2><span style="color:blue"> Informacja! MA Na serwerze $Hostname Backup baz danych SQL wykonana.</span></h1>
<h3><p><span style="color:green">Liczba plikow w folderze Archiwum na dysku C: OPTIMA Backup - $numFiles.</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">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
<style>
table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
th, td {
padding: 5px;
}
</style>
</head>
</html>
</body>
"@
$html += "</table>"
# Konfiguracja parametrów wysyłania e-maila
$smtp = New-Object Net.Mail.SmtpClient($smtpServer, $smtpPort)
$smtp.EnableSSL = $false
$smtp.Credentials = New-Object System.Net.NetworkCredential($Username, $Password)
# Wysłanie e-maila na każdy adres osobno
foreach ($recipient in $To) {
$mailMessage = New-Object System.Net.Mail.MailMessage($From, $to, $subject, $body)
$mailMessage.IsBodyHtml = $true
$smtp.Send($mailMessage)
}
Write-Host "E-mail został wysłany z informacjami o pojemności dysków."
#Zostały użyte elementy skryptów z internetu-------------------------------------------------------------------
#https://evotec.pl/easy-way-to-connect-to-ftps-and-sftp-using-powershell/; https://stackoverflow.com/; ...
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ść.
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."
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)
# 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)
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"
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
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
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!
#Przypisanie użytkownikom grupy globalne
#Wymuszenie zabezpieczenia obiektu użytkownika przed przypadkowym usunięciem
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!"
}
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"
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
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
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
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ń.
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ą.
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:
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"
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 🙂
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.
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.
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
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/
- Szczegóły
- Grzegorza Niemierowskiego
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.
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