niedziela, 27 października 2013

Wyłączenie kilku kont użytkowników w AD - Skrypty VBS/ BAT cz.7

Przy pomocy skryptu VBS możemy wyłączyć grupowo konta które są nieaktywne od jakiegoś czasu, lub konta takich osób które już nie pracują.

1) Blokowanie osób, które nie pracują w firmie:

Do pliku users dodajemy konta, które chcemy zablokować, w pliku disabledusers mamy informacje które konta zostały zablokowane.

Windows Deployment System (WDS) z pomocą WAIK cz.3

Nieco wygodniejszą możliwością instalacji systemu operacyjnego jest wykorzystanie WAIK, pobieramy go ze strony microsoft.com.

1) Konfiguracja nadzorowanej instalacji przy pomocy WAIK:


Windows Deployment System (WDS) cz.2

Zainstalujemy teraz Windows 7 przy pomocy WDS. Przygotujemy obrazy wraz z możliwością bootowania ich poprzez sieć.

1) Instalacja MS Windows 7 przy pomocy WDS:


Windows Deployment System (WDS) cz.1

Mając do zainstalowania system operacyjny na kilkunastu stacjach naprawdę można popaść w lekką paranoję. Jednak możemy ułatwić sobie nieco życie możemy użyć WDS, dzięki któremu zdalnie jesteśmy w stanie zainstalować nowy system operacyjny.

W tym celu wykorzystamy MS Windows 2008 Server, do tego musimy zainstalować: Active Directory, DHCP, DNS. Kary sieciowe naszych maszyn nie mogą mieć przypisanych adresów IP na stałe, komputery muszą mieć możliwość bootowania systemu z sieci.

sobota, 26 października 2013

Alert - MSSQL 2008 cz.11

Możemy ustawić powiadomienia, gdy nasz dziennik transakcji przekroczy pewien ustalony procent zajętości miejsca na dysku.

Poniższy alert powiadomi operatora w tym przypadku administrator gdy dziennik transakcji zostanie zapełniony w 70%:

Harmonogram zadań - MSSQL 2008 cz.10

Możemy zaoszczędzić sporo czasu przy codziennych czynnościach lub takich które robimy co jakiś czas. W takich sytuacjach możemy wykorzystać znany z sytemu Windows harmonogram zadań, możemy w nim skonfigurować automatyczne wykonywanie pewnych czynności, jak backup, odbudowywanie indeksów bazy itd.

Na początek skonfigurujemy operator, który będzie wysyłał informacje na maila w przypadku niepowodzenia ustawionych przez nas zadań lub pojawienia się zagrożeń.

sobota, 12 października 2013

Migawki bazy danych - MSSQL 2008 cz.9

Jedną z nowych funkcji wprowadzonych w SQL 2005 jest migawka. Jest kolejnym typem wykonywania kopii zapasowej bazy danych. W odróżnieniu od już opisanych jest typem tylko do odczyty, przez co w kopii nie ma dziennika transakcji. Jak wszystko również migawka pomimo szybkości jej tworzenia posiada ograniczenia:

- nie obsługuje FILESTREAM,
- nie można odłączyć bazy na której wykonana została migawka,
- migawki nie działają na systemowej bazie (master, model, tempdb, msdb)
- jako że migawka to kopia zapasowa, nie można jej ponownie zarchiwizować,
- migawka musi znajdować się w tej samej instancji co baza źródłowa

poniedziałek, 7 października 2013

Wyszukaj.Pionowo MS Exel 2007

Jakiś czas temu miałem "przyjemność" wykonywać obliczenia przy użyciu magicznych jak się później okazało funkcji Exela, chodzi o Wyszukaj.Pionowo.
Poniekąd jest to przydatna funkcja gdy chcemy znaleźć konkretną wartość w dużej przestrzeni arkusza.

Powiedźmy, że potrzebujemy odnaleźć Imię oraz Nazwisko pracownika określonego przez jego identyfikator (numer) :



Powiedźmy że chcemy dowiedzieć się jak nazywa się pracownik o numerze 43.

=WYSZUKAJ.PIONOWO(43; A2:C10; 3; FAŁSZ)

*43 - numer pracownika,
*A2:C10 - zakres kolumn w których przeprowadzamy wyszukiwanie,
* 3 - jest to kolumna w kórej spodziewamy się znaleźć imię oraz nazwisko pracownika,
* FAŁSZ - dokładne dopasowanie, szukanej wartości, jeżeli ustawimy PRAWDA dopasowanie będzie albo dokładne albo przybliżone.



Odzyskiwanie bazy po awarii - MSSQL 2008 cz.8

Równie ważnym jak tworzenie kopii zapasowych jest ich późniejsze odzyskiwanie w przypadku awarii.

1) Nowy wpis:

Na początku dodajmy do naszej bazy nowy wpis:

USE AdventureWorks2008
GO

INSERT INTO HumanResources.Department (Name, GroupName)
VALUES('Test4', 'Test4')
GO

niedziela, 6 października 2013

Podstawowe informacje o maszynie (Nazwa oraz Ilość Ram) - Skrypty VBS cz.6

Skrypcik pokazujący jak się nazywa oraz ile pamięci (w GB) operacyjne ma maszyna na której taki skrypt uruchamiamy.

strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colSettings = objWMIService.ExecQuery ("Select * from Win32_ComputerSystem")
For Each objComputer in colSettings 
Wscript.Echo  objComputer.Name & " ma " & Round(((objComputer.TotalPhysicalMemory)/1073537024),2) & " GB RAM "Next



Tworzenie nowego użytkownika w AD - Skrypty VBS cz.5

Skrypt umożliwiający utworzenie nowego konta lub kont w zadanej jednostce organizacyjnej. Musimy uzupełnić według własnych potrzeb zmienne określające nazwę jednostki organizacyjnej oraz nazwę konta które chcemy stworzyć.

Dim objDomain, objOU, ouName, userName
'NAZWA TWORZONEJ JEDNOSTKI ORGANIZACYJNEJouName = "Studenci"'NAZWA TWORZONEGO KONTAuserName = "Student"
Set objRootDSE = GetObject("LDAP://rootDSE")Set objDomain = GetObject("LDAP://" & objRootDSE.Get("defaultNamingContext"))
'TWORZENIE JEDNOSTKI ORGANIZACYJNEJ O NAZWIE STUDENCISet objOU=objDomain.Create("organizationalUnit", "ou=" & ouName)objOU.SetInfo
Set objContainer = GetObject("LDAP://OU=Studenci," & objRootDSE.Get("defaultNamingContext"))
'TWORZENIE 10 UŻYTKOWNIKÓW O NAZWIE STUDENTFor i = 1 To 10Set objLeaf = objContainer.Create("User", "cn=" & userName & i)objLeaf.Put "sAMAccountName", userName & i
Next'INFORMACJA O UTWORZONYCH KONTACHWScript.Echo "Konta zostały utworzone."





Odblokowywanie oraz zmian hasła dla konta w AD - Skrypty VBS cz.4

Skrypt pozwalający na odblokowanie konta użytkownika podanego jako parametr oraz zmiana hasła dla zadanego konta. 

Option Explicit Dim objUser, objDomain, lngBias, objLockout, dtmLockout Dim objDuration, lngDuration, lngHigh, lngLow, dtmUnLock Dim strUserDN, strDNSDomain, strNetBIOSDomain, strUserNTName Dim objTrans, objShell, lngBiasKey, k, objRootDSE Dim strText, strTitle, intConstants, intAns, objNetwork ' Constants for the NameTranslate object. Const ADS_NAME_INITTYPE_GC = 3 Const ADS_NAME_TYPE_NT4 = 3 Const ADS_NAME_TYPE_1779 = 1 strTitle = "UnlockUser" Set objShell = CreateObject("Wscript.Shell") ' Request user sAMAccountName. strUserNTName = Trim(InputBox("Enter User NT Logon Name", strTitle)) If strUserNTName = "" Then strText = "Program Aborted" intConstants = vbOKOnly + vbExclamation intAns = objShell.Popup(strText, , strTitle, intConstants) WScript.Quit End If ' Retrieve DNS domain name. Set objRootDSE = GetObject("LDAP://RootDSE") strDNSDomain = objRootDSE.Get("defaultNamingContext") ' Convert DNS domain name to NetBIOS domain name. Set objTrans = CreateObject("NameTranslate") objTrans.Init ADS_NAME_INITTYPE_GC, "" objTrans.Set ADS_NAME_TYPE_1779, strDNSDomain strNetBIOSDomain = objTrans.Get(ADS_NAME_TYPE_NT4) ' Remove trailing backslash. strNetBIOSDomain = Left(strNetBIOSDomain, Len(strNetBIOSDomain) - 1) Set objNetwork = CreateObject("Wscript.Network") If UCase(Trim(strUserNTName)) = UCase(Trim(objNetwork.UserName)) And UCase(strNetBIOSDomain) = UCase(objNetwork.UserDomain) Then strText = "You cannot unlock or change the password for your own account." intConstants = vbOKOnly + vbExclamation intAns = objShell.Popup(strText, , strTitle, intConstants) WScript.Quit End If ' Convert user NT name to Distinguished Name. On Error Resume Next objTrans.Set ADS_NAME_TYPE_NT4, strNetBIOSDomain & "\" & strUserNTName If Err.Number <> 0 Then On Error GoTo 0 strText = "User " & strUserNTName & " not found" strText = strText & vbCrLf & "Program aborted" intConstants = vbOKOnly + vbCritical intAns = objShell.Popup(strText, , strTitle, intConstants) WScript.Quit End If On Error GoTo 0 strUserDN = objTrans.Get(ADS_NAME_TYPE_1779) ' Escape any forward slash characters, "/", with the backslash ' escape character. All other characters that should be escaped are. strUserDN = Replace(strUserDN, "/", "\/") ' Bind to user object. On Error Resume Next Set objUser = GetObject("LDAP://" & strUserDN) If Err.Number <> 0 Then On Error GoTo 0 strText = "User " & strUserNTName & " not found" strText = strText & vbCrLf & "DN: " & strUserDN strText = strText & vbCrLf & "Program aborted" intConstants = vbOKOnly + vbCritical intAns = objShell.Popup(strText, , strTitle, intConstants) WScript.Quit End If On Error GoTo 0 ' Bind to domain. Set objDomain = GetObject("LDAP://" & strDNSDomain) ' Obtain local Time Zone bias from machine registry. lngBiasKey = objShell.RegRead("HKLM\System\CurrentControlSet\Control\TimeZoneInformation\ActiveTimeBias") If UCase(TypeName(lngBiasKey)) = "LONG" Then lngBias = lngBiasKey ElseIf UCase(TypeName(lngBiasKey)) = "VARIANT()" Then lngBias = 0 For k = 0 To UBound(lngBiasKey) lngBias = lngBias + (lngBiasKey(k) * 256^k) Next End If ' Retrieve user lockoutTime, Convert to date and display lockout status. On Error Resume Next Set objLockout = objUser.lockoutTime If Err.Number <> 0 Then On Error GoTo 0 strText = "User " & strUserNTName & " is not locked out." strText = strText & vbCrLf & "Would you like to reset the password?" intConstants = vbYesNo + vbQuestion intAns = objShell.Popup(strText, , strTitle, intConstants) If intAns = vbYes Then Call ChangePassword(objUser) WScript.Quit End If On Error GoTo 0 dtmLockout = Integer8Date(objLockout, lngBias) If dtmLockout = #1/1/1601# Then strText = "User " & strUserNTName & " is not locked out." strText = strText & vbCrLf & "Would you like to reset the password?" intConstants = vbYesNo + vbQuestion intAns = objShell.Popup(strText, , strTitle, intConstants) If intAns = vbYes Then Call ChangePassword(objUser) WScript.Quit End If strText = "User " & strUserNTName & " locked out at: " & dtmLockout ' Retrieve domain lockoutDuration policy. Set objDuration = objDomain.lockoutDuration lngHigh = objDuration.HighPart lngLow = objDuration.LowPart If (lngHigh = 0 And lngLow = 0) Then ' There is no domain lockout duration policy. ' Locked out accounts remain locked out Until reset. ' Any user With value of lockoutTime greater than 0 is locked out. lngDuration = -999 strText = strText & vbCrLf & "Domain locked accounts do not automatically unlock." Else If (lngLow < 0) Then lngHigh = lngHigh + 1 End If lngDuration = lngHigh * (2^32) + lngLow lngDuration = -lngDuration/(60 * 10000000) strText = strText & vbCrLf & "Domain lockout duration (minutes): " & lngDuration End If ' Determine if account still locked out and ask user how to proceed. Dim intUnlockAns intUnlockAns = vbNo If lngDuration = -999 Then strText = strText & vbCrLf & "Account is locked indefinately." strText = strText & vbCrLf & "Click ""Yes"" to unlock account now" strText = strText & vbCrLf & "Click ""No"" to leave account locked" intConstants = vbYesNo + vbExclamation intUnlockAns = objShell.Popup(strText, , strTitle, intConstants) Else dtmUnLock = DateAdd("n", lngDuration, dtmLockout) If Now > dtmUnLock Then strText = strText & vbCrLf & "The account was unlocked at: " & dtmUnLock strText = strText & vbCrLf & "Would you like to reset the password?" intConstants = vbYesNo + vbQuestion intAns = objShell.Popup(strText, , strTitle, intConstants) If intAns = vbYes Then Call ChangePassword(objUser) WScript.Quit Else strText = strText & vbCrLf & "Account will unlock at: " & dtmUnLock strText = strText & vbCrLf & "Click ""Yes"" to unlock account now" strText = strText & vbCrLf & "Click ""No"" to leave account locked" intConstants = vbYesNo + vbExclamation intUnlockAns = objShell.Popup(strText, , strTitle, intConstants) End If End If If intUnlockAns = vbYes Then On Error Resume Next objUser.IsAccountLocked = False objUser.SetInfo If Err.Number <> 0 Then On Error GoTo 0 strText = "Unable to unlock user " & strUserNTName strText = "You may not have sufficient rights" strText = "Program aborted" intConstants = vbOKOnly + vbCritical intAns = objShell.Popup(strText, , strTitle, intConstants) Else On Error GoTo 0 strText = "User " & strUserNTName & " unlocked" intConstants = vbOKOnly + vbExclamation intAns = objShell.Popup(strText, , strTitle, intConstants) End If ElseIf intAns = vbNo Then strText = "User " & strUserNTName & " account left locked out" intConstants = vbOKOnly + vbInformation intAns = objShell.Popup(strText, , strTitle, intConstants) Else strText = "Program aborted" strText = strText & vbCrLf & "User " & strUserNTName & " still locked out" intConstants = vbOKOnly + vbExclamation intAns = objShell.Popup(strText, , strTitle, intConstants) End If ' Clean up. Set objUser = Nothing Set objDomain = Nothing Set objLockout = Nothing Set objDuration = Nothing Set objTrans = Nothing Set objShell = Nothing Function Integer8Date(objDate, lngBias) ' Function to convert Integer8 (64-bit) value to a date, adjusted for ' local time zone bias. Dim lngAdjust, lngDate, lngHigh, lngLow lngAdjust = lngBias lngHigh = objDate.HighPart lngLow = objdate.LowPart ' Account for bug in IADslargeInteger property methods. If lngLow < 0 Then lngHigh = lngHigh + 1 End If If (lngHigh = 0) And (lngLow = 0) Then lngAdjust = 0 End If lngDate = #1/1/1601# + (((lngHigh * (2 ^ 32)) + lngLow) / 600000000 - lngAdjust) / 1440 Integer8Date = CDate(lngDate) End Function Sub ChangePassword(objUser) Dim strPassword, intPwdValue, strText strPassword = RandomPassword(8) intPwdValue = 0 ' Force a change of password at next logon strText = "The user will be required to change their password when they logon." strPassword = InputBox(strText,"The new password is:",strPassword) If strPassword <> "" Then objUser.SetPassword strPassword objUser.Put "PwdLastSet", intPwdValue objUser.SetInfo Else strText = "Password not changed" intConstants = vbOKOnly + vbExclamation intAns = objShell.Popup(strText, , strTitle, intConstants) End If End Sub Function RandomPassword(intCharacters) Dim intASCIIValue, i, intLowerLimit, intUpperLimit Randomize intLowerLimit = 48 intUpperLimit = 122 For i = 1 To intCharacters intASCIIValue = Int(((intUpperLimit - intLowerLimit + 1) * Rnd) + intLowerLimit) RandomPassword = RandomPassword & Chr(intASCIIValue) Next End Function



sobota, 5 października 2013

Tworzenie backupu bazy - MSSQL 2008 cz.7

Niewątpliwie jednym z najważniejszych, jak nie najważniejszym zagadnienie podczas nadzoru nad infrastrukturą programową jest tworzenie kopi zapasowych najbardziej wrażliwych danych dla firmy. Brak robienia kopi zapasowych czy słabe dbanie o kondycję sprzętu może skończyć się nieciekawie dla ważnych firmowych danych.

Baza musi posiadać model odzyskiwania FULL:
ALTER DATABASE AdventureWorks2008 
  SET RECOVERY FULL
GO

piątek, 4 października 2013

Eksportowanie oraz importowanie danych (Import Export Wizard) - MSSQL 2008 cz.6.1

W poprzedniej części pokazałem użycie dwóch narzędzi "tekstowych", można również wykorzystać wersję okienkową.
1)  Utwórzmy nową pomocniczą bazę:

CREATE DATABASE AWTest

2) Rozpocznijmy export danych:

czwartek, 3 października 2013

Opróżnienie bufora drukarki

W pracy zdarza się, że drukarka zaczyna drukować co chce jak chce i kiedy chce. Jeżeli tak jak w naszej firmie macie HP możecie zrobić tzw. Cold Reset, dzięki czemu jesteśmy w stanie usunąć dane które z jakiegoś powodu nie zostały wydrukowane, lub pomimo że drukarka nie drukuje następne pliki zostawały dodawane ;). Jako że sam z tego korzystałem wrzucę filmik z youtube.com, na którym pokazana jest ta czynność.

Eksportowanie oraz importowanie danych (BCP,BULK INSERT) - MSSQL 2008 cz.6

Jedną z podstawowych czynności jakie wykonywane są w codziennej pracy w środowisku MS SQL 2008 jest eksport oraz import danych.
W celu wyeksportowania oraz zaimportowania danych użyjemy 2 różnych narzędzi:

1) BCP (Bulk Copy Program) - służy zarówno do wyeksportowania danych do pliku .txt lub .bcp (wystarczy zmienić rozszerzenie z .txt na .bcp w poniższym poleceniu) jak i importu. Dane można wyeksportować zarówno na dysk lokalny serwera jak i na udział sieciowy. Drugą możliwością jest import danych z pliku, warunkiem jest zmiana parametru out na in. Dodatkowo warto wiedzieć, że do eksportu wystarczy, aby konto użytkownika miało możliwość wykonania SELECT na bazie. Natomiast do importu konto musi posiadać możliwość wykonania poza SELECT również INSERT oraz ALTER TABLE.

wtorek, 1 października 2013

Mapowanie drukarki sieciowej - Skrypty VBS cz.3

Podobnie jak montowane są udziały sieciowe, możemy montować kolejną niezastąpioną rzecz w firmie czyli drukarkę sieciową, z której może korzystać kilka osób. Oczywiście również taki udział  jak drukarka może zostać zamontowany poprzez skrypt.

Mapowanie udziału sieciowego - Skrypty VBS cz.2

W wielu firmach pracownicy pracują na plikach, które udostępniane są wprost z dysków serwera. Oczywiście, na początku musimy jakoś dostać się do serwera, najprościej jest zmapować dysk w postaci ikony w Mój Komputer, można robić to ręcznie lub też automatycznie poprzez skrypt.

Poniższa wersja dotyczy sytuacji, w której komputer nie jest dodany do domeny, przydatny w sytuacji gdy "ktoś" z zewnątrz przychodzi do firmy i potrzebuje mieć dostęp do firmowych plików:

Option Explicit

Dim objNetwork
Dim objShell
Dim desktopLink
Dim objSpace
Dim userDesktop
Dim strLocalDrive
Dim strRemoteShare
Dim strUsr
Dim strPas
Dim strPer
Dim strPath

Dodawanie komputera do domeny - Skrypty VBS cz.1

W jednym z poprzednich wpisów, pokazałem w jaki sposób dodać komputer do domeny, teraz chciałbym pokazać w jaki sposób zautomatyzować tę czynność. Tym wpisem chciałbym rozpocząć cykl, który będzie pokazywał w jaki sposób ułatwić sobie życie.

Dodawanie komputera do domeny jest dość prostą czynnością, jednak gdy mamy do wrzucenie np. 100 stacji do domeny robi się to nieco denerwujące. Dlatego uruchomienie skryptu .vbs spowoduje, że nastąpi to automatycznie, a następnie po 5 sekundach komputer się zrestartuje. Po ponownym jego uruchomieniu będziemy mogli zalogować się na konto domenowe.