VBS Cleanup Sessionfiles

Article is written in the Dutch language…

Het onderstaande script heb ik geschreven om bestanden in een bepaalde directory verwijderen als ze ouder zijn dan een opgegeven aantal dagen. Het script is ontworpen ‘silent’ te draaien m.b.v. bijvoorbeeld de windows taskscheduler-service. Het resultaat van de actie en eventuele foutmeldingen worden in de windows eventlog geregistreerd.

*** Het gebruik van dit scripts en code van deze site is op eigen risico. Test scripts en code grondig voor ingebruikname en zorg ervoor dat je begrijpt wat er wordt uitgevoerd! | Use published scripts and code at your own risk and test thoroughly before usage. Make sure you understand te code! ***

'*********************************************************************
'bestandsnaam: SESSCLEAN.VBS
'geschreven_door: Tim van Kooten Niekerk
'versie: 11:39 22-2-2010
'info: CleanUp (session) bestanden ouder dan x dagen.
'info: Use at your own risk and test thoroughly before usage.
'*********************************************************************

'Procedure Settings (Settings en Declaraties)
  option explicit
  dim oFSO, oWSH, vEventLogHeader, vEventLogFooter
  set oFSO = CreateObject("Scripting.FileSystemObject")
  Set oWSH = WScript.CreateObject("Wscript.Shell")
  vEventLogHeader = "SESSCLEAN.VBS" & vbCrLf
  vEventLogFooter = vbCrLf & vbCrLf & "Info: Bestanden ouder dan een opgegeven aantal " & _
                    "dagen worden bij het starten van dit script verwijderd uit de " & _
                    "opgegeven directory."

'Functie fCleanUPDIR (Clean Up Session Dir)
function fCleanUPDir(vCleanUPDir,vDaysOld)
  if oFSO.FolderExists(vCleanUPDir) then
    if vDaysOld > 0 and vDaysOld < 100 then
      dim vFolder1, vBestandsNaam, f1, vBestandsDate, vFilesDeleted
      vFilesDeleted = 0
      set vFolder1 = oFSO.GetFolder(vCleanUPDir)
      set vFolder1 = vFolder1.Files
      for each f1 in vFolder1
        vBestandsNaam = f1.name
        vBestandsDate = f1.datelastmodified
        if IsDate(vBestandsDate) then
          vBestandsDate = CDate(vBestandsDate)
          if (now - vBestandsDate) > vDaysOld then
            oFSO.DeleteFile(vCleanUPDir & "" & vBestandsNaam)
            vFilesDeleted = vFilesDeleted + 1
          end if
        end if
      next
      'Schrijf de uitkomst en ingestelde waarden naar de eventlog als mededeling.
      oWSH.LogEvent 0, vEventLogHeader & _
                      vFilesDeleted & " bestand(en) van ouder dan " & vDaysOld & _
                      " dag(en) verwijderd uit " & vCleanUPDir & vEventLogFooter
      else
        'Schrijf foutmelding naar de eventlog als waarschuwing
        oWH.LogEvent 2, vEventLogHeader & _
                       "Opgegeven waarde (" & vDaysOld & " dag(en)) bevindt zich " & _
                       "buiten de scope van 0-100. Controleer de configuratie." & _
                       vEventLogFooter
      end if
  else
    'Schrijf foutmelding naar de eventlog als waarschuwing
    oWSH.LogEvent 2, vEventLogHeader & _
                    "Opgegeven Directory (" & vCleanUPDir & ") kon niet worden gevonden. " & _
                    "Controleer of de directory bestaat of op fouten in de configuratie." & _
                    vEventLogFooter
  end if  
end function

fCleanUPDir "D:Tempphpsession", 1
fCleanUPDir "D:Tempphpupload", 1

' Einde van script

 

PowerShell AD groupmembers

Simple script using dsquery to query groupmembers from an Active Directory group and return the results to screen. The script takes parameters from the commandline (groupmem.ps1 “DOMAIN” “GROUP_NAME”).

[string]$sADPath = dsquery group -domain "$($args[0])" -name "$($args[1])"
$sADPath = "LDAP://" + $sADPath | Foreach-Object {$_ -replace "`"", ""}
$oADGroup = [ADSI]("$sADPath")
$oADGroup.path
$oADGroup.member

 

PowerShell T-SQL Scripting

Article written in the Dutch language…

Met onderstaande commando’s kun je d.m.v. T-SQL gegevens opvragen uit een MSSQL database m.b.v. SQL PowerShell Modules of SQLPS.

$sResult = Invoke-Sqlcmd -Query "SELECT @@SERVERNAME AS Servername;" `
                         -QueryTimeout 3 `
                         -ServerInstance [SERVERNAME][INSTANCE] `
                         -Database master

Vervolgens vraag je de inhoud van bovenstaande voorbeeld d.m.v. variable $sResult.Servername. Bij een een resultaat van meer dan een record worden de values opgeslagen in een array. In dat geval geeft de variabele $sResult.count het aantal geretourneerde regels terug (-gt 1). Je kunt dan bijvoorbeeld de eerste regel van het resultaat opvragen d.m.v. $sResult[0].columnname. Je kunt m.b.v. onderstaande statement afvangen of het resultaat uit meer dan twee regels bestaat.

if ($sResult.count -gt 1) {
  # TestVoorbeeld afhandelen Array...
  write-host "Er zitten " $sResult.count " values in de array..." 
  foreach ($oResultItem in $sResult) {
    $oResultItem.Servername
  }
} else {
  # Afhandelen string value...
  $sResult.Servername
}

Ook is het mogelijk vanuit een specifieke context gegevens op te vragen.

cd SQLSERVER:SQL{servername}{instancename}Databasesmsdb
Invoke-Sqlcmd -Query "SELECT * FROM sysjobs;" -QueryTimeout 3

 

MSSQL Move Tempdb Files

Move tempdb files to a different location.

USE MASTER
GO
ALTER DATABASE tempdb MODIFY FILE (name = tempdev, filename = 'D:\Path\To\tempdatafile.mdf')
GO
ALTER DATABASE tempdb MODIFY FILE (name = templog, filename = 'L:\Path\To\templogfile.ldf')
GO

Restart the database engine and check if the new files are created. For more information on file locations you can use the stored procedure sp_helpfile. Remove the files from the original location.

MSCLUSTER 2008 Cluster Commandline

Display cluster resources.

cluster [group | res]
PS> [Get-ClusterGroup | Get-ClusterResource] -Cluster "<CLUSTERNAME>"
PS> Get-ClusterGroup -Cluster "<CLUSTERNAME>" | Where-Object { $_.OwnerNode -eq "<CLUSTERNODE>" } | SELECT Name

Move a cluster group to a different node.

cluster group "Cluster Group" /moveto:<NODENAME>
PS>  Move-ClusterGroup -Name "Cluster Group" -Cluster "<CLUSTERNAME>" -Node "<CLUSTERNODE>"

Display all registered nodes for a resource.

cluster res "SQL Network Name (NETWORKNAME)" /listowners
PS> Get-ClusterOwnerNode -Cluster "<CLUSTERNAME>" -Resource "<CLUSTERRESOURCE>

Bring cluster group online…

PS> Start-ClusterGroup -Name "<CLUSTERGROUPNAME>"

Switch a AlwaysOn Group to a secondary replica…

Switch-SqlAvailabilityGroup -Path SQLSERVER:\SQL\[SERVER]\[INSTANCE]|DEFAULT\AvailabilityGroups\[AOGROUP]

Change witness fileshare on a NodeAndFileMajority cluster. First change to NodeMajority and then back to NodeAndFileMajority using the new fileshare.

PS> Set-ClusterQuorum -NodeMajority
PS> Set-ClusterQuorum -NodeAndFileShareMajority \\server\fswitness$\clustername

MSSQL Check TransactionLog Backup

Check if the are database without recent (2 days) TransactionLog backups for all databases in FULL Recovery.

SELECT sys.databases.name
FROM sys.databases
WHERE sys.databases.name NOT IN
(SELECT DISTINCT sys.databases.name from sys.databases 
INNER JOIN msdb..backupset ON sys.databases.name = msdb..backupset.database_name
WHERE (msdb..backupset.type = 'L' AND msdb..backupset.backup_start_date > (GetDate() -2)))
AND sys.databases.recovery_model != 3 and sys.databases.state = 0

MSSQL Restore Torn Page

To restore a specific torn page first make a backup from the transaction log with NORECOVERY (tail backup).

RESTORE DATABASE Databasename PAGE='1:234'
FROM DISK='X:\Path\To\Full\DatabaseBackupFile.bak'
WITH NORECOVERY
GO

Then restore all transaction log backups made sinds the Full backup with NORECOVERY. Then restore the tail backup WITH RECOVERY.