Sunday, August 2, 2015

How to enable Windows 10 dark theme

Well Windows 10 was released to the general public last week on 7/29/2015. Since then I found out about a cool tweak you can make with just a slight adjustment, This will likely be added to the PC Setting context menu in the future as a toggle button but for now you still have to manually add it by creating a single registry key. Wait really that's it, Yes it is!

I threw in a quick little revert back function called Set-LightTheme just in case you don't like the dark theme(I think you are weird).



Please download functions from the Microsoft Script Repository!








Click here to download the script from the Microsoft Script Repository!









Wednesday, February 18, 2015

Enable AD Recycing Bin and prevent accidental deletion for all objects

We've all have heard about the new recycling bin feature that was introduced with Server 2008 R2, sadly the recycling bin is not enabled by default... I do not know why this is but I feel it is a huge mistake on Microsoft's part...

So I wrote a little function that will enable the recycling bin. But that's not it, it will also set all OUs, computer accounts and user accounts to be protected from accidental deletion. A log file is saved in C:\windows\temp as well.

Preventive maintenance can be the most important maintenance.

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
Function Set-ADSafeMode {
<#
 .CREATED BY:
     Matthew A. Kerfoot
 .CREATED ON:
     2/18/2015
 .Synopsis
    Enables the AD recycling Bin and prevents all OUs\computer\users accounts from accidental deletion.
 .DESCRIPTION
    Checks the AD recycling bin to see if it is enabled, if not it will enable it. Then it checks all OUs `
    in the domain to see if they are being prevented from accidental deletion, if not it will check the `
    check box that prevents them from accidental deletion. This is also done for all user and computer accounts on your domain.
 .FUNCTIONALITY
    PowerShell v2 (must be ran from a DC(the activedirectory module is required))
 #>
[CmdletBinding(SupportsShouldProcess=$True)]
param(
        [Parameter(Mandatory=$false,ValueFromPipeline=$true)]
        [string]$VerbosePreference = "SilentlyContinue",
        [Parameter(Mandatory=$false,ValueFromPipeline=$true)]
        [string]$ErrorActionPreference = "SilentlyContinue",
        [Parameter(Mandatory=$false,ValueFromPipeline=$true)]
        [string[]]$LogDate = (get-date -format "MM-d-yy-HH")
    )

Function global:Write-Verbose { [string] $Message }

Import-Module activedirectory

$VerbosePreference = "Continue"

Start-Transcript -Path "C:\Windows\temp\$LogDate.log"

#More or less turns on and\or enables logging to begin.
Write-Verbose

$Bin = Get-ADOptionalFeature -Filter 'name -like "Recycle Bin Feature"' -Properties IsDisableable | `
       Select @{ Name = "NeedsToBeEnabled" ; Expression = { ( $_.IsDisableable ) } }

   If ($Bin.NeedsToBeEnabled -eq $False)
       {
         Write-Host "The Active Directory Recycling Bin has already been enabled!" -ForegroundColor "Green"
       }
   Else
       {
         Write-Host "The Active Directory Recycling Bin NEEDS TO BE ENABLED!" -ForegroundColor "Red"

         Enable-ADOptionalFeature 'Recycle Bin Feature' -Scope ForestOrConfigurationSet -Target $env:USERDOMAIN -WhatIf

         Write-Host "The Active Directory Recycling has now been enabled!!" -ForegroundColor "Red"
       }

            #Sets all OU to be protewcted against accidental deletion
            Get-ADOrganizationalUnit -filter * -Properties ProtectedFromAccidentalDeletion | `
            Set-ADOrganizationalUnit -ProtectedFromAccidentalDeletion $true -Verbose -WhatIf

        #Sets all user and Computer accounts to be protected from accidental deletion
        Get-ADObject -filter * -Properties ProtectedFromAccidentalDeletion | Where-Object {$_.ObjectClass -eq "user" -or $_.ObjectClass -eq "Computer"} | Set-ADObject -ProtectedFromAccidentalDeletion $true -WhatIf

    Write-Host "Script Completed Successfully!" -ForegroundColor "Green" | Tee-Object "C:\Windows\temp\$LogDate.log" -Verbose

#Ends the logfile
Stop-Transcript

 } Set-ADSafeMode

If you prevent fires you don't have to put out fires...

Thursday, December 4, 2014

PowerShell Counters

 Last night we received an alert for the following "SQLServer:Locks: Average Wait Time (ms) is above it's currently configured threshold"... What an obscure alert, that I see far too often. Here’s the PowerShell way to check if this has been resolved.


First we need to open a PowerShell console on the machine in question as an Administrator to get the correct SQL counter set name.

001
Get-Counter -ListSet * | select CounterSetName


Okay so that does give us all the information we are requesting but in order to get a nice output that only contains SQL counters we could filter out all counters that do NOT have *SQL* in the name.

001
Get-Counter -ListSet * | select CounterSetName | Where-Object {$_.CounterSetName -like "*SQL*"}



Now that we know the counter set name is "SQLServer:Locks" we can run the following command to see a list of the counters within SQLServer:Locks.

001
Get-Counter -ListSet SQLServer:Locks | Select-Object Counter -ExpandProperty Counter


From here it is as easy as:

001
Get-Counter -Counter "\SQLServer:Locks(*)\Lock Wait Time (ms)"

There are a few gotchas however, you will need quotes around the counter name because it contains spaces and this must be ran in an administrative shell.



As shown above the average lock wait time has been reduced to 0 which tells me this alert has now cleared out. Below I've added some more popular cmdlets to this command to get a little more data at an interval that you can specify.

001
Get-Counter -Counter "\SQLServer:Locks(*)\Lock Wait Time (ms)" -SampleInterval 10 -MaxSamples 3