DSCResources/MSFT_xDatabaseServer/MSFT_xDatabaseServer.psm1

data LocalizedData
{
    # culture="en-US"
    ConvertFrom-StringData @'
    LoginModeSuccess=Successfully set loginMode to '{0}'.
    LoginModeError=Failed to set loginMode to '{0}'. Ensure SQL Server is properly installed.
    LoginModeTestError=Failed to find current loginMode. Ensure SQL Server is properly installed.
    LoginModeTestTrue=The current LoginMode value '{0}' matches the desired loginMode value '{1}'.
    LoginModeTestFalse=The current LoginMode value '{0}' does NOT match the desired loginMode value '{1}'.
'@

}

Import-Module $PSScriptRoot\..\xDatabase_Common


function Get-TargetResource
{
    [CmdletBinding()]
    [OutputType([System.Collections.Hashtable])]
    param
    (
        [parameter(Mandatory = $true)]
        [ValidateSet("Windows","Mixed")]        
        [System.String]
        $LoginMode
    )

        try
        {
            $RegPath = (dir 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\' -Recurse | where property -eq "LoginMode").PSPath
            $ActualLoginModeValue = (Get-ItemProperty $RegPath -Name LoginMode).LoginMode 
            $ActualLoginMode = if($ActualLoginModeValue -eq 1){"Windows"}else{"Mixed"}
        }
        catch
        {
            $errorId = "LoginModeTest";
            $errorCategory = [System.Management.Automation.ErrorCategory]::InvalidResult
            $errorMessage = $($LocalizedData.LoginModeTestError) 
            $exception = New-Object System.InvalidOperationException $errorMessage 
            $errorRecord = New-Object System.Management.Automation.ErrorRecord $exception, $errorId, $errorCategory, $null

            $PSCmdlet.ThrowTerminatingError($errorRecord);
        }

        $returnValue = 
        @{
            LoginMode = $ActualLoginMode
         }

       $returnValue
}


function Set-TargetResource
{
    [CmdletBinding()]
    param
    (
        [parameter(Mandatory = $true)]
        [ValidateSet("Windows","Mixed")]
        [System.String]
        $LoginMode
    )

    
    if($PSBoundParameters.ContainsKey('LoginMode')) # Set SQL authentication to Mixed: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQLServer\LoginMode
    {
        try
        {
            $RegPath = (dir 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\' -Recurse | where property -eq "LoginMode").PSPath
            
            $LoginModeValue = if($LoginMode -eq "Windows"){1}else{2}
    
            set-itemproperty $RegPath LoginMode $LoginModeValue

            # restart SQL instance for above to take affect:
            net stop MSSQLServer
            net start MSSQLServer

            Write-Verbose $($LocalizedData.LoginModeSuccess -f $LoginMode)
        }
        catch
        {
            $errorId = "LoginMode";
            $errorCategory = [System.Management.Automation.ErrorCategory]::InvalidResult
            $errorMessage = $($LocalizedData.LoginModeError) -f ${LoginMode} 
            $exception = New-Object System.InvalidOperationException $errorMessage 
            $errorRecord = New-Object System.Management.Automation.ErrorRecord $exception, $errorId, $errorCategory, $null

            $PSCmdlet.ThrowTerminatingError($errorRecord);
        }
    }
}


function Test-TargetResource
{
    [CmdletBinding()]
    [OutputType([System.Boolean])]
    param
    (
        [parameter(Mandatory = $true)]        
        [ValidateSet("Windows","Mixed")]
        [System.String]
        $LoginMode
    )
    
    $ReturnValue = $true

    if($PSBoundParameters.ContainsKey('LoginMode'))
    {
        $LoginModeValue = if($LoginMode -eq "Windows"){1}else{2}

        try
        {
            $RegPath = (dir 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\' -Recurse | where property -eq "LoginMode").PSPath
            
            $ActualLoginModeValue = (Get-ItemProperty $RegPath -Name LoginMode).LoginMode
            
            $ActualLoginMode = if($ActualLoginModeValue -eq 1){"Windows"}else{"Mixed"}
            
        }
        catch
        {
            $errorId = "LoginModeTest";
            $errorCategory = [System.Management.Automation.ErrorCategory]::InvalidResult
            $errorMessage = $($LocalizedData.LoginModeTestError) 
            $exception = New-Object System.InvalidOperationException $errorMessage 
            $errorRecord = New-Object System.Management.Automation.ErrorRecord $exception, $errorId, $errorCategory, $null

            $PSCmdlet.ThrowTerminatingError($errorRecord);
        }

        if ($ActualLoginModeValue -ne $LoginModeValue)
        {
            $ReturnValue = $false
            
            Write-Verbose $($LocalizedData.LoginModeTestFalse -f $ActualLoginMode, $LoginMode)
        }
        else
        {
            Write-Verbose $($LocalizedData.LoginModeTestTrue -f $ActualLoginMode, $LoginMode)
        }
    }

    return $ReturnValue

}


Export-ModuleMember -Function *-TargetResource