Pora na IT-postanowienie noworoczne! Naucz się Powershell lub SQL!

2017-01-02

Tak, wiem. To co najmniej dziwne, że wraz z Nowym Rokiem robimy sobie postanowienia noworoczne. Co najmniej, jakby postanowienie z dnia 13 marca było mniej ważne niż postanowienie z 1 stycznia… Wychodzę jednak z założenia, że na dobre rzeczy każda chwila jest odpowiednia! Przypuszczalnie większość noworocznych postanowień jest dobra, bo ma na celu poprawę naszej kondycji fizycznej lub umysłowej. Gdybym więc prowadził klub fitness, to teraz zaprosiłbym każdego do regularnego uprawiania wysiłku fizycznego, ale… nie prowadzę klubu fitness…

Za to ze mną w Nowym Roku możesz się nauczyć czegoś nowego. Zapraszam do wspólnej nauki SQL i PowerShell w ramach akademii UDEMY. Na razie do dyspozycji są trzy kursy:

 

Kto ma ochotę powiedzieć „dość” swoim brakom w wiedzy i nauczyć się SQL lub PowerShell jest mile widziany. Na powitanie prezent:

z kuponem STUDY2017  cena kursu spada do 10€ !

udemy_coupon

Oczywiście ja też mam postanowienie noworoczne! Chcę dla Was i z Wami przygotować jescze więcej kursów. Mam nadzieję, że się uda. Kursy po publikacji, będą przez pewien czas dostępne za darmo, więc jeśli chcesz aby cię o tym poinformować, zapisz się już teraz do newslettera. Kiedy publikuję na blogu nowy wpis, ty dostaniesz na ten temat maila. W ten sposób nie ominie cię darmowy okres w jakim będzie można bez kosztów zapisać się na moje szkolenie.

Więcej o nauce na Udemy

By Rafał Kraik in Aktualności

PowerShell: Własny typ enum

2016-12-27

Bardzo nie lubię literówek w moich skryptach, dlatego gdzie mogę korzystam z intellisence, wybieram wartości z listy, korzystam ze zmiennych zamiast stałych napisowych itp. W C# uwielbiam typ enum, bo dzięki niemu mogę korzystać z nic mi nie mówiących wartości liczbowych za pomocą nazwanch tekstów. W Powershellu również można korzystać z typu enum:

Add-Type -TypeDefinition @"
 public enum ShareMode
 {
 Shared = 1,
Private = 2, 
Hidden = 4
 }
"@

W powyższym przykładzie zadeklarowałem typ FeaturesMap. Zmienne tego typu mogą przyjmować wartości:

[ShareMode]::Shared
[ShareMode]::Private
[ShareMode]::Hidden

Aby zadeklarować zmienną tego typu skorzystać można z następującej składni:

[ShareMode]$myVariable = [ShareMode]::Shared

Gdzieś pod spodem moja zmienna ma wartość 1, ale podczas pisania skryptu można ją porównywać do wartości zapisywanej jako [ShareMode]::Shared, np tak

if($myVariable -eq [ShareMode]::Shared)
{
    echo 'shared mode'
}
By Rafał Kraik in Power Shell

Powershell: Dodanie do listy select pewnej wartości stałej

2016-12-14

Mamy następującą sytuację. W AD jest sobie grupa HR. Członkiem tej grupy jest użyrkownik Johny Employer. Grupa ma ustawioną właściwość ManagedBy na innego użytkownika Johny Manager.

Chcielibyśmy dostać raport, w którym wyświetlimy nazwy wszystkich członków grupy HR, a obok nazwę managera (czyli osoby ustawionej dla grupy w polu ManagedBy.

Zaczynamy od znalezienia managera:

$manager = Get-ADGroup -filter {name -eq'hr'} -properties ManagedBy |
   Select -ExpandProperty ManagedBy |
      Get-ADUser |
         Select -expand name

Co się tu dzieje? Szukamy grupy HR, ale dodatkowo prosimy aby wynik zawierał właściwość ManagedBy. Zakładając, że grupę uda się znaleźć to nie interesuje nas nic poza właściwością ManagedBy, dlatego pobieramy tę właściwość zapominając o całej reszcie. Służy do tego parametr Expand, który „awansuje właściwość obiektu do rangi obiektu”. Mając namiar na managera pozostaje pobrać obiekt konta użytkownika i z niego pobrać tylko właściwość name, zapominając o całej reszcie, stąd ponownie opcja expand. Super. Nazwa użytkownika będącego managerem jest teraz w zmiennej $manager.

Teraz pora na wyświetlenie wyniku (omawiam to dokładnie w lekcji 35 naszego kursu Powershell dla administratora Windows):

Get-ADGroup "HR" |
   Get-ADGroupMember -Recursive |
      Select name, @{name='Manager';e={$manager}}

Zaczynamy od znalezienia grupy HR, następnie listujemy członków tej grupy i wreszcie w poleceniu select decydujemy co należy wyświetlić. A są to:

  • nazwa użytkownika z grupy
  • oraz nowa wyliczana właściwość o nazwie Manager i wartości takiej, jak zawartość zmiennej $manager.
By Rafał Kraik in Power Shell

SQL: Problem z patchowaniem: missing Windows Installer cache files

2016-12-06

Zdarza się, że podczas instalacji aktualizacji SQL Server pojawiają się błędy związane z brakującymi plikami MSI. Albo to wcześniej instalacja została wykonana z dysku sieciowego, który teraz już nie jest dostępny, albo nadgorliwy administrator Windows wykasował pliki z cache MSI… no cóż!

Może się więc wydarzyć, że instalacja po prostu się nie udaje. W takim przypadku jedną z ostatnich desek ratunku może być skrypt FindSQLInstalls.vbs ze strony: https://support.microsoft.com/pl-pl/kb/969052

Instalator podczas aktualizacji szuka określonych plików w pewnych lokalizacjach:

  • najpierw jest to folder cache MSI
  • jeśli plik nie zostanie tam znaleziony to sprawdzana jest oryginalna lokalizacja pliku (czyli tam, gdzie znajdował się instalator w momencie instalacji.

Zadaniem tego skryptu jest sprawdzenie gdzie powinny się znajdować poszczególne pliki, aby instalacja się powiodła. Jeśli pliku nie ma w cache, skrypt pokaże, gdzie znajdował się plik podczas instalacji. Poniżej przykład z wyniku uruchomienia skryptu gdy pliku brakuje:

 

================================================================================

PRODUCT NAME   : SQL Server 2008 R2 SP2 Reporting Services

================================================================================

  Product Code: {2453DBC8-ACC4-4711-BD03-0C15353AA3D8} Czytaj dalej »

By Rafał Kraik in SQL

Powershell: Generowanie hasła

2016-12-06

Napisanie skryptu generującego hasło, to jedno z przyjemniejszych zadań programistycznych. Jest for, są iteracje, jest random. Mniam mniam. Dobra funkcja generująca hasło to jednak coś innego! I właśnie taką udało mi się znaleźć. To co w niej jest najlepsze, to że:

  • można określić z jakiej grupy znaków należy generować hasła oraz
  • masz gwarancję, że z każdej grupy zostanie wzięty co najmniej jeden znak

Pomyśl teraz (przyjaźnie) o swoim administratorze domeny. Czy nie masz wymogu definiowania hasła o określonej długości ze znakami z określonych grup? Funkcja pochodzi z http://stackoverflow.com/questions/37256154/powershell-password-generator-how-to-always-include-number-in-string (odpowiedź opublikowana przez iRon).

Function Get-Password
{
Param( 
 [cmdletbinding()]
 #Length of the password
 [Int]$Size = 8, 
 #Charactersets that can be used when password is generated Uppercase, Lowercase, Numbers, Symbols
 [Char[]]$CharSets = "ULNS", 
 #Characters to skip during password generation
 [Char[]]$Exclude) 

 #Here final password letters will be saved
 $Chars = @(); 
 $TokenSet = @()

 #define table of allowed character lists
 If (!$TokenSets) 
 {
 $TokenSets = @{
      U = [Char[]]'ABCDEFGHIJKLMNOPQRSTUVWXYZ' #Upper case
      L = [Char[]]'abcdefghijklmnopqrstuvwxyz' #Lower case
      N = [Char[]]'0123456789' #Numerals
      S = [Char[]]'!"#$%&''()*+,-./:;<=>?@[\]^_`{|}~' #Symbols
    }
 }

 #for each set of charactersets allowed (U/L/N/S)
 foreach ($characterSet in $CharSets) 
 {
    #take the table of characters in this character set skipping those characters that should be excluded
    $Tokens = $TokenSets["$characterSet"] | ForEach {If ($Exclude -cNotContains $_) {$_}}

    #if still some characters left (should be usually the case)
    If ($Tokens) 
    {
       #generate the table of only the valid characters
       $TokensSet += $Tokens
       #as we guarantee that at least one character of each character set will
       #be present in the password, we take here one character from the list
       $Chars += $Tokens | Get-Random
    }
 }
 
 #now we get random number of characters from the approved list
 While ($Chars.Count -lt $Size) 
 {
    $Chars += $TokensSet | Get-Random
 }
 
 #finally we return the result - the list of charaters needs to be converted to a string
 ($Chars | Sort-Object {Get-Random}) -Join "" 
};

Czytaj dalej »

By Rafał Kraik in Power Shell

Powershell: Komunikat podczas ładowania modułów: Security Warning Run only scripts that you trust

2016-12-06

Podczas ładowania skryptu lub ładowania modułu można otrzymać bład/komunikat/pytanie:

Security Warning Run only scripts that you trust. While scripts from the Internet can be useful, this script can potentially harm your computer. Do you want to run \server\scripts\my.ps1? [D] Do not run [R] Run once [S] Suspend [?] Help (default is „D”):

Komunikat właściwie nie zabrania uruchomienia skryptu, ale problemem jest to, że się… pokazuje!

Przyczyna jest taka, że jeśli plik jest oznaczony „jako pobrany z Internetu” albo znajduje się w ścieżce intranetowej, to podczas uruchamiania go brane są pod uwagę ustawienia bezpieczeństw Internet Explorera „Enhanced Security Configuration”.

Do spróbowania 3 rozwiązania:

  • Wyłączyć ESC (Server Manager >> Local server >> IE Enhanced Security Configuration
  • Potraktować pliki skryptu poleceniem Ublock-File
  • Zmienić policy na BYPASS

Ja zastosowałem metodę numer 3 i pomogło!

By Rafał Kraik in Power Shell

Windows 10: Kopiowanie dysku systemowego HDD na mniejszy SSD, klonowanie dysku systemowego

2016-12-04

To chyba dosyć typowy scenariusz. Kupujesz komputer, ale fundusze nie pozwalają na zakup wymarzonej wszystkomającej wersji, więc trzeba trochę oszczędzać. W laptopie najczęściej chyba zdecydujesz się na zakup komputera ze standardowym dyskiem HDD, bo przecież z czasem wymiana dysku na SDD nie będzie problemem. W końcu nadchodzi ten dzień i postanawiasz kupić dysk SSD, Jest prawie pewne, że nowy dysk SSD będzie miał mniejszą pojemność niż stary dysk HDD.

I tu mogą się pojawić pewne problemy:

  • Jak przenieść dane z większego dysku HDD na mniejszy dysk SSD
  • Jak przenieść dane z dysku systemowego Windows 10
  • Jak wykonać optymalizację przenoszonych danych z dysku HDD na dysk SSD
  • Jak to zrobić bezpiecznie i … za darmo?

backupper_0

Poszukałem kilku rozwiązań i to jedno spodobało mi się najbardziej i na dodatek zadziałało od razu. Zacznijmy najpierw od przygotowania dysku SSD. Jeżeli dysk jest zupełnie nowy to nie trzeba wykonywać tego kroku. Mój „nowy” dysk SSD pochodził z innego komputera, więc zacząłem od wyczyszczenia:

  • Podłącz dysk do komputera jako drugi dysk (np. po USB)
  • Uruchom jako administrator cmd i wpisz diskpart
  • Poleceniem list disk wyświetl listę dysków. Patrząc np. na wielkość dysku zidentyfikuj numer dysku SSD, U mnie był to dysk numer 1. Pamiętaj, że w diskpart numeracja dysków rozpoczyna się od zera. Za chwilę rozpocznie się kasowanie partycji na dysku, co jeśli zostałoby wykonane w niepoprawny sposób, to spowoduje utratę danych, dlatego… bardzo uważaj!
  • Wpisz select disk <numer> wskazując na swój dysk SSD
  • Wpisz list partition, żeby zobaczyć partycje istniejące na dysku
  • Kasuj po kolei każdą partycję wpisując „delete partition <numer> override„. Na bieżąco można sprawdzać postęp kasowania partycji powtarzając polecenie „list partition” tak długo aż lista partycji na dysku SSD będzie pusta.

Czytaj dalej »

By Rafał Kraik in Helpdesk