# encoding: ascii
# api: powershell
# title: isMSDTC.ps1
# description: Checks whether MSDTC is enabled for network access. By default MSDTC network access is disabled. This feature is needed by SQL Server Linked Servers
# version: 0.1
# type: script
# author: Chad Miller
# license: CC0
# x-poshcode-id: 2027
# x-archived: 2016-11-08T06:00:57
# x-published: 2010-07-28T12:28:00
#
#
#MSDTC is needed by SQL Server Linked Servers
#This script checks whether MSDTC has been configured for network access
#See KB http://support.microsoft.com/default.aspx?scid=kb;en-us;816701 for steps to enable
#All values except AllowOnlySecureRpcCalls should be true
param($computerName=$env:computerName)

#On an x64 system the registry keys for MSDTC will only be accessible from an x64 shell.
#See http://gallery.technet.microsoft.com/ScriptCenter/en-us/6062bbfc-53bf-4f92-994d-08f18c8324c0 for details and workaround
#This script just checks for condition rather than workaround issue.

$is64 = [bool](gwmi win32_operatingsystem -computer $computerName | ?{$_.caption -like "*x64*" -or $_.OSArchitecture -eq'64-bit'})
$isShell32 = [bool]((Get-Process -Id $PID | ?{$_.path -like "*SysWOW64*"}) -or !([IntPtr]::Size -eq 8))

if ($is64 -and $isShell32)
{Write-Warning "Unable to open registry keys because $computerName is running an x64 OS. Script must be run from a PowerShell x64 shell" }
else
{
    $reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine',$computerName)
    $msdtcKey = $reg.OpenSubKey("SOFTWARE\\Microsoft\\MSDTC")
    $securityKey = $msdtcKey.OpenSubKey("Security")
    new-object psobject -property @{ComputerName=$computerName;AllowOnlySecureRpcCalls=[bool]$msdtcKey.GetValue('AllowOnlySecureRpcCalls');TurnOffRpcSecurity=[bool]$msdtcKey.GetValue('TurnOffRpcSecurity');
                      NetworkDtcAccessAdmin=[bool]$securityKey.GetValue('NetworkDtcAccessAdmin');NetworkDtcAccessClients=[bool]$securityKey.GetValue('NetworkDtcAccessClients');
                      NetworkDtcAccessInbound=[bool]$securityKey.GetValue('NetworkDtcAccessInbound');NetworkDtcAccessOutbound=[bool]$securityKey.GetValue('NetworkDtcAccessOutbound');
                      NetworkDtcAccessTransactions=[bool]$securityKey.GetValue('NetworkDtcAccessTransactions');XaTransactions=[bool]$securityKey.GetValue('XaTransactions')}
}
