0

我有以下代码,我正在尝试使其正常工作,我从此处的链接中获得了以下代码

http://itknowledgeexchange.techtarget.com/dba/powershell-sql-server-health-check-script/

所以这是我根据需要修改的代码

#Create a new Excel object using COM
$Excel = New-Object -ComObject Excel.Application
$Excel.visible = $True
#$Excel.visible = $False


#$workbook = $excel.Workbooks.Open("C:\pac.xlsx")

$Excel = $Excel.Workbooks.Add()
$Sheet = $Excel.Worksheets.Item(1)

#Counter variable for rows

$intRow = 2

#Read thru the contents of the SQL_Servers.txt file
#$servers = Import-Csv "\\pni-vmdbasql\d$\monitoring\inputs\sqltab.txt"
#$servers = Import-Csv "\\ent-pocpacapcx01\d$\monitoring\sqltab.txt"
$servers = Import-Csv "C:\sqltab.txt"

#########################################################
foreach ($entry in $servers)
{
$torp = $entry.TorP
$mon = $entry.monitor
$machine = $entry.server
$errorlog = $entry.errorlog
$os = $entry.os2000
$iname = $entry.Instance
if ($iname -eq "Null")
{
$instance = "$machine"
}
else
{
$instance = "$machine\$iname"
}
if ($torp -eq "Prod")
{
$ServerType = "Production"
}
else
{
$ServerType = "Test"
}
$instance = $instance.toupper()

#########################################################
#foreach ($instance in get-content "C:\SQL_Servers.txt")
#{

#Create column headers
$Sheet.Cells.Item($intRow,1) = "INSTANCE NAME:"
$Sheet.Cells.Item($intRow,2) = $instance
################################################

#This script gets SQL Server database information using PowerShell

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null

# Create an SMO connection to the instance
$s = New-Object ('Microsoft.SqlServer.Management.Smo.Server') $instance

$dbs = $s.Databases

#$dbs | SELECT Name, Collation, CompatibilityLevel, AutoShrink, RecoveryModel, Size, SpaceAvailable

#Formatting using Excel

$version = $s.VersionString

if ($version -like "*9.00.1399*")
{        $sqlversion = "SQL Server 2005 No Service Pack"
}
elseif ($version -like "*9.00.2047*")
{        $sqlversion = "SQL Server 2005 SP1"
}
elseif ($version -like "*9.00.3042*")
{        $sqlversion = "SQL Server 2005 SP2"
}
elseif ($version -like "*9.00.3068*")
{        $sqlversion = "SQL Server 2005 SP2"
}
elseif ($version -like "*9.00.3054*")
{        $sqlversion = "SQL Server 2005 SP2 with Q934458"
}
elseif ($version -like "*9.00.3073*")
{        $sqlversion = "SQL Server 2005 SP2 with Q954606"
}
elseif ($version -like "*9.00.3186*")
{        $sqlversion = "SQL Server 2005 SP2 with Q939562"
}
elseif ($version -like "*9.00.4035*")
{        $sqlversion = "SQL Server 2005 SP3"
}
## SQL Server 2000 Checks
elseif ($version -like "*8.00.194*")
{        $sqlversion = "SQL Server 2000 No SP"
}
elseif ($version -like "*8.00.384*")
{        $sqlversion = "SQL Server 2000 SP1"
}
elseif ($version -like "*8.00.532*")
{        $sqlversion = "SQL Server 2000 SP2"
}
elseif ($version -like "*8.00.760*")
{        $sqlversion = "SQL Server 2000 SP3"
}
elseif ($version -like "*8.00.818*")
{        $sqlversion = "SQL Server 2000 SP3 with MS03-031"
}
elseif ($version -like "*8.00.2039*")
{        $sqlversion = "SQL Server 2000 SP4"
}
elseif ($version -like "*8.00.2040*")
{        $sqlversion = "SQL Server 2000 NoSP with Q274329"
}
elseif ($version -like "*8.00.2050*")
{        $sqlversion = "SQL Server 2000 SP4 with MS08-040"
}
elseif ($version -like "*8.00.2187*")
{        $sqlversion = "SQL Server 2000 SP1 with Q923849"
}
elseif ($version -like "*8.00.2282*")
{        $sqlversion = "SQL Server 2000 QFE"
}
elseif ($version -like "*8.00.3073*")
{        $sqlversion = "SQL Server 2000 SP2 with Q954606"
}
#SQL Server 7
elseif ($version -like "*7.00.1094*")
{        $sqlversion = "SQL Server 7 SP4 with Q815495, Q821279"
}
#SQL Server 2008
elseif ($version -like "*10.0.1442.32*")
{        $sqlversion = "SQL Server 2008 X64 MSDN Beta"
}

else
{        $sqlversion = "Check me $version"
}

$Sheet.Cells.Item($intRow,3) = "Version:"
$Sheet.Cells.Item($intRow,4) = $sqlversion
$Sheet.Cells.Item($intRow,5) = $ServerType
if ($Servertype -eq "Production")
{
$fgColor = 35
}
else
{
$fgColor = 0
}
$Sheet.Cells.item($intRow, 5).Interior.ColorIndex = $fgColor

###########################################################

$Sheet.Cells.Item($intRow,1).Font.Bold = $True
$Sheet.Cells.Item($intRow,2).Font.Bold = $True
$Sheet.Cells.Item($intRow,3).Font.Bold = $True
$Sheet.Cells.Item($intRow,4).Font.Bold = $True
$Sheet.Cells.Item($intRow,5).Font.Bold = $True

##############################################
## Are full and tranlog backups running?
## DB Reindexing running?
##############################################

$intRow ++

$jobsserver = $s.JobServer
$jobs = $jobsserver.Jobs
$ijob = 0
$backjob = 0
$tranjob = 0
foreach ($job in $jobs)
{

if (($job.name -like "*backup*") -and ($job.name -notlike "*Tranlog*"))
{
$backjob = 1
$fullbackup = $job.name
$fullbackupstatus = $job.LastRunOutcome
$fullbackupdate = $job.LastRunDate

}
if ($job.Name -like "*tranlog*"

)
{
$tranjob = 1
$tranlogbackup = $job.name
$tranlogbackupstatus = $job.LastRunOutcome
$tranlogbackupdate = $job.LastRunDate

}
if ($job.Name -like "*index*")
{
$ijob = 1
$rebuildindex = $job.Name
$rebuildindexstatus = $job.LastRunOutcome
$rebuildindexdate = $job.LastRunDate

}
}

## Check to verify full backups are running ##
$dayago = [datetime]::Now.AddDays(-1)
if (($fullbackupstatus -eq "Succeeded") -and ($fullbackupdate -gt $dayago))
{
$fullbackupjob = "Full Backups Running"
}
elseif(($fullbackupstatus -ne "succeeded") -or ($fullbackupdate -lt $dayago))
{
$fullbackupjob = "Full Backups Failing"
}
if ($backjob -eq 0)
{
$fullbackupjob = "No Full Backup Job"
}

## Check to verify that Tranlogs backups are running fine ##
$hourago = [datetime]::Now.AddHours(-1)
if (($tranlogbackupstatus -eq "Succeeded") -and ($tranlogbackupdate -gt $hourago))
{
$tranbackupjob = "Tran Backup Running"

}
if(($tranlogbackupstatus -ne "succeeded") -or ($tranlogbackupdate -lt $hourago))
{
$tranbackupjob = "Tran BackupFailing"
}
if ($tranjob -eq 0)
{
$tranbackupjob = "No Tran Backup Job"
}

$weekago = [datetime]::Now.AddDays(-7)
if (($rebuildindexstatus -eq "Succeeded") -and ($rebuildindexdate -gt $weekago))
{
$indexjob = "Indexing Running"

}
elseif(($rebuildindexstatus -ne "succeeded") -or ($rebuildindexdate -lt $weekago))
{
$indexjob = "Indexing Failing"

}
if ($ijob -eq 0)
{
$indexjob = "No Indexing Job"

}

$Sheet.Cells.Item($intRow,1) = $fullbackupjob
$Sheet.Cells.Item($intRow,2) = $tranbackupjob
$Sheet.Cells.Item($intRow,3) = $indexjob
$Sheet.Cells.Item($intRow,1).Font.Bold = $True
$Sheet.Cells.Item($intRow,2).Font.Bold = $True
$Sheet.Cells.Item($intRow,3).Font.Bold = $True

##############################################

$intRow++

$Sheet.Cells.Item($intRow,1) = "DATABASE NAME"
$Sheet.Cells.Item($intRow,2) = "RECOVERY MODEL"
$Sheet.Cells.Item($intRow,3) = "SIZE (MB)"
$Sheet.Cells.Item($intRow,4) = "SPACE AVAILABLE (MB)"
$Sheet.Cells.Item($intRow,5) = "DATA DRIVE"
$Sheet.Cells.Item($intRow,6) = "SPACE AVAILABLE ON DISK (GB)"
$Sheet.Cells.Item($intRow,7) = "MIRROR STATUS"
$Sheet.Cells.Item($intRow,8) = "LOG SIZE (MB)"

#Format the column headers
for ($col = 1; $col –le 8; $col++)
{
$Sheet.Cells.Item($intRow,$col).Font.Bold = $True
$Sheet.Cells.Item($intRow,$col).Interior.ColorIndex = 48
$Sheet.Cells.Item($intRow,$col).Font.ColorIndex = 34
}

$intRow++
#######################################################
#      #This script gets SQL Server database information using PowerShell
#
#      [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null
#
#      # Create an SMO connection to the instance
#      $s = New-Object ('Microsoft.SqlServer.Management.Smo.Server') $instance
#
#      $dbs = $s.Databases
#
#      #$dbs | SELECT Name, Collation, CompatibilityLevel, AutoShrink, RecoveryModel, Size, SpaceAvailable
#
#      #Formatting using Excel

foreach ($db in $dbs)
{
$name = $db.name
$model = $db.recoverymodel
if ($model -eq 1)
{
$modelname = "Full"
}
elseif ($model -eq 2)
{
$modelname = "Bulk Logged"
}
elseif ($model -eq 3)
{
$modelname = "Simple"
}

$logfiles = $db.LogFiles
foreach ($log in $logfiles)
{
$logsize = $log.size/1KB
$logsize = [math]::Round($logsize, 2)
}

#if(($name -ne "master") -and ($name -ne "model")) # -and ($name -ne "msdb"))
#{
#Divide the value of SpaceAvailable by 1KB
$dbSpaceAvailable = $db.SpaceAvailable/1KB

#Format the results to a number with three decimal places
$dbSpaceAvailable = "{0:N3}" -f $dbSpaceAvailable

$Sheet.Cells.Item($intRow, 1) = $db.Name

$Sheet.Cells.Item($intRow, 2) = $modelname
$Sheet.Cells.Item($intRow, 3) = "{0:N3}" -f $db.Size

#Change the background color of the Cell depending on the SpaceAvailable property value
if ($dbSpaceAvailable -eq 0.00)
{
$fgColor = 38
}
else
{
$fgColor = 0
}

$Sheet.Cells.Item($intRow, 4) = $dbSpaceAvailable
$Sheet.Cells.item($intRow, 4).Interior.ColorIndex = $fgColor

$dblocation = $db.primaryfilepath

$dblocation = $dblocation.split(":")

$dbdrive = $dblocation[0]
$drives = Get-WmiObject -ComputerName $machine Win32_LogicalDisk | Where-Object {$_.DriveType -eq 3}
foreach($drive in $drives)
{
$size1 = $drive.size / 1GB
$size = "{0:N2}" -f $size1
$free1 = $drive.freespace / 1GB
$free = "{0:N2}" -f $free1
$ID = $drive.DeviceID
$a = $free1 / $size1 * 100
$b = "{0:N2}" -f $a

if ($dbdrive -eq "C")
{
$fgColor = 38
}
else
{
$fgColor = 0
}

$Sheet.Cells.Item($intRow,5) = $dbdrive
$Sheet.Cells.item($intRow, 5).Interior.ColorIndex = $fgColor

if ($id -like "$dbdrive*")
{

if ($free1 -lt 5)
{
$fgColor = 38
}
else
{
$fgColor = 0
}
if (($ID -eq "C:") -and ($free1 -lt 1))
{
$fgColor = 38
}
$Sheet.Cells.Item($intRow,6) = $free1
$Sheet.Cells.item($intRow, 6).Interior.ColorIndex = $fgColor
}
}
if($version -like "*2000*")
{$mirrorstate = 0}
else
{
$mirrorstate = $db.MirroringStatus
}
if ($mirrorstate -eq 0)
{
$mirror = "No Mirror"
}
if ($mirrorstate -eq 1)
{$mirror = "Suspended"
}
if($mirrorstate -eq 5)
{
$mirror = "Synchronized"
}
if ($mirrorstate -eq 1)
{
$fgcolor = 38
}
else
{
$fgcolor = 0
}
$Sheet.Cells.Item($intRow,7) = $mirror
$Sheet.Cells.item($intRow, 7).Interior.ColorIndex = $fgColor

if ($logsize -gt 500)
{
$fgColor = 38
}
else
{
$fgColor = 0
}
$Sheet.Cells.Item($intRow,8) = $logsize
$Sheet.Cells.item($intRow, 8).Interior.ColorIndex = $fgColor

$intRow ++

#}
}

$intRow ++

}

$Sheet.UsedRange.EntireColumn.AutoFit()
cls

$workbook.saveas("C:\pac.xlsx")
#$excel.Quit()
$WorkBook = $Null
$WorkSheet = $Null
$Excel = $Null
[GC]::Collect()

所以我的 sqltab.txt 文件看起来像这样

monitor,Server,Instance,TorP,ErrorLog,Ping
Y,lamaqldev01,lamydevl05,T,,

我收到以下错误,因为我收集它是身份验证错误。那么如何以及在哪里传递 sa 帐户及其密码的参数?

运行代码时出现错误 1(这是我所说的身份验证错误)

在此处输入图像描述

运行代码后error2 在此处输入图像描述

4

2 回答 2

0

ServerConnection您可以在代码中创建 SMO 连接(大约第 60 行)时尝试传递一个对象

$mySrvConn = new-object Microsoft.SqlServer.Management.Common.ServerConnection
$mySrvConn.ServerInstance=$srvname
$mySrvConn.LoginSecure = $false
$mySrvConn.Login = "username"
$mySrvConn.Password = "password"

$srv = new-object Microsoft.SqlServer.Management.SMO.Server($mySrvConn)
于 2012-04-19T13:33:27.067 回答
0

如果您想缩短if/elseif用于检查$version一点的 70 行代码(使其更容易理解),您可以使用switch语句将其减少到 28 行。

你可以这样做:


    switch -wildcard ($version)
    {
        "*9.00.1399*" {$sqlversion = "SQL Server 2005 No Service Pack"}
        "*9.00.2047*" {$sqlversion = "SQL Server 2005 SP1"}
        "*9.00.3042*" {$sqlversion = "SQL Server 2005 SP2"}
        "*9.00.3068*" {$sqlversion = "SQL Server 2005 SP2"}
        "*9.00.3054*" {$sqlversion = "SQL Server 2005 SP2 with Q934458"}
        "*9.00.3073*" {$sqlversion = "SQL Server 2005 SP2 with Q954606"}
        "*9.00.3186*" {$sqlversion = "SQL Server 2005 SP2 with Q939562"}
        "*9.00.4035*" {$sqlversion = "SQL Server 2005 SP3"}
            ## SQL Server 2000 Checks
        "*8.00.194*" {$sqlversion = "SQL Server 2000 No SP"}
        "*8.00.384*" {$sqlversion = "SQL Server 2000 SP1"}
        "*8.00.532*" {$sqlversion = "SQL Server 2000 SP2"}
        "*8.00.760*" {$sqlversion = "SQL Server 2000 SP3"}
        "*8.00.818*" {$sqlversion = "SQL Server 2000 SP3 with MS03-031"}
        "*8.00.2039*" {$sqlversion = "SQL Server 2000 SP4"}
        "*8.00.2040*" {$sqlversion = "SQL Server 2000 NoSP with Q274329"}
        "*8.00.2050*" {$sqlversion = "SQL Server 2000 SP4 with MS08-040"}
        "*8.00.2187*" {$sqlversion = "SQL Server 2000 SP1 with Q923849"}
        "*8.00.2282*" {$sqlversion = "SQL Server 2000 QFE"}
        "*8.00.3073*" {$sqlversion = "SQL Server 2000 SP2 with Q954606"}
            #SQL Server 7
        "*7.00.1094*" {$sqlversion = "SQL Server 7 SP4 with Q815495, Q821279"}
            #SQL Server 2008
        "*10.0.1442.32*" {$sqlversion = "SQL Server 2008 X64 MSDN Beta"}
        default {$sqlversion = "Check me $version"}
    }

Switch语句可以更轻松地查看您正在检查的内容。您可以将所有长if/else语句更改为switch,它将教训长度并使其更易于维护。

于 2012-04-19T13:42:51.483 回答