functions/Test-SqlPath.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
Function Test-SqlPath
{
<#
.SYNOPSIS
Tests if file or directory exists from the perspective of the SQL Server service account
 
.DESCRIPTION
Uses master.dbo.xp_fileexist to determine if a file or directory exists
 
.PARAMETER SqlServer
The SQL Server you want to run the test on.
 
.PARAMETER Path
The Path to tests. Can be a file or directory.
 
.PARAMETER SqlCredential
Allows you to login to servers using SQL Logins as opposed to Windows Auth/Integrated/Trusted. To use:
 
$scred = Get-Credential, then pass $scred object to the -SqlCredential parameter.
 
Windows Authentication will be used if SqlCredential is not specified. SQL Server does not accept Windows
credentials being passed as credentials. To connect as a different Windows user, run PowerShell as that user.
 
 
.NOTES
Author: Chrissy LeMaire (@cl), netnerds.net
Requires: Admin access to server (not SQL Services),
Remoting must be enabled and accessible if $sqlserver is not local
 
dbatools PowerShell module (https://dbatools.io, clemaire@gmail.com)
Copyright (C) 2016 Chrissy LeMaire
 
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
 
.LINK
https://dbatools.io/Test-SqlPath
 
.EXAMPLE
Test-SqlPath -SqlServer sqlcluster -Path L:\MSAS12.MSSQLSERVER\OLAP
 
Tests whether the service account running the "sqlcluster" SQL Server isntance can access L:\MSAS12.MSSQLSERVER\OLAP. Logs into sqlcluster using Windows credentials.
 
.EXAMPLE
$credential = Get-Credential
Test-SqlPath -SqlServer sqlcluster -SqlCredential $credential -Path L:\MSAS12.MSSQLSERVER\OLAP
 
Tests whether the service account running the "sqlcluster" SQL Server isntance can access L:\MSAS12.MSSQLSERVER\OLAP. Logs into sqlcluster using SQL authentication.
#>

    [CmdletBinding()]
    [OutputType([bool])]
    param (
        [Parameter(Mandatory = $true)]
        [Alias("ServerInstance", "SqlInstance")]
        [object]$SqlServer,
        [Parameter(Mandatory = $true)]
        [string]$Path,
        [System.Management.Automation.PSCredential]$SqlCredential
    )

    #$server = Connect-SqlServer -SqlServer $SqlServer -SqlCredential $SqlCredential
    $FunctionName =(Get-PSCallstack)[0].Command
    try 
    {
        if ($sqlServer -isnot [Microsoft.SqlServer.Management.Smo.SqlSmoObject])
        {
            Write-verbose "$FunctionName - Opening SQL Server connection"
            $NewConnection = $True
            $Server = Connect-SqlServer -SqlServer $SqlServer -SqlCredential $SqlCredential    
        }
        else
        {
            Write-Verbose "$FunctionName - reusing SMO connection"
            $server = $SqlServer
        }
    }
    catch {

        Write-Warning "$FunctionName - Cannot connect to $SqlServer" 
        break
    }
    Write-Verbose "$FunctionName - Path check is $path"
    $sql = "EXEC master.dbo.xp_fileexist '$path'"
    try
    {
        #$fileexist = Invoke-SqlCmd2 -server $server -Query $sql
        $fileexist = $server.ConnectionContext.ExecuteWithResults($sql)
    }
    catch
    {
        Write-Warning "Test-SQLPath failed: $_"
        throw
    }
    if ($fileexist.tables.rows[0] -eq $true -or $fileexist.tables.rows[1] -eq $true)
    {
        return $true
    }
    else
    {
        return $false
    }
}