none
查詢公司網域內的SQL主機版本 RRS feed

  • 問題

  • 大家好:

    我是一位POWERSHELL的新手。日前接到主管指示,要查詢公司內所有SQL SERVER的版本,如2008,2008R2,2012.....及是否為標版準或企業版。於是我研究一番後,組出以下的語法。我將SQL SERVER主機名放到C:\Intel\sql.txt,之後開始進行查詢,但我發現,有些SQL SERVER主機我無法連線時,它還是會出現SQL版本,如"DB02"這台主機已關機,但還是會出現,Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) ,Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)....等資訊

      不知我是什麼地方的語法下錯了呢????能否請版本上的先進指導,謝謝。

    $remote_sql =Get-Content C:\Intel\sql.txt
    ForEach ($remote_sql_name in $remote_sql){
        try{
        $sql_verion_edition=((sqlcmd -S $remote_sql_name -U sa -P OOXXOOXX -Q "select @@VERSION")).split("`n")|Select-String -Pattern ( "edition");

        }catch{
          "bad name:"+$remote_sql_name|Out-File -FilePath C:\Intel\20160506_error.txt -Append -Encoding default
        }finally{
        $sql_verion_edition=((sqlcmd -S $remote_sql_name -U sa -P OOXXOOXX -Q "select @@VERSION")).split("`n")|Select-String -Pattern ( "edition");
        $sql_verion=((sqlcmd -S $remote_sql_name -U sa -P OOXXOOXX -Q "select @@VERSION")).split("`n")|Select-String -Pattern ( "microsoft SQL");
        Write-Output( "$remote_sql_name,$sql_verion,$sql_verion_edition" ) |Out-File -FilePath C:\Intel\20160506.txt -Append -Encoding default   
        }
    }

    ****************************************

    剛剛在進行測試,發現一個怪異的問題(在開啟POWERSHELL時,我都是用"以管理者權限"的方式進行開啟)

    我的電腦是WIN7 SP1+SQL2012+POWERSHELL5.0主控台,我的執行結果就如同上面所述;但是我遠端桌面到其中一台主機,它是WI2008 R2+SQL2008+POWERSHELL 3.0,用這台電腦來執行....結果就是正確的。

    那我就很好奇,為何同樣的指令碼,在不同電腦上有不同的結果呢???

    • 已編輯 豬肉榮_TW 2016年5月9日 上午 02:00 內容修改
    2016年5月9日 上午 12:30

解答

  • 1. SQL Server 無法連線應該會有錯誤,
    2. 執行的權限跟有沒有以管理者權限"的方式進行開啟
    3. 能不能查詢到跟你的 SQL Server 驗證方式有關, 如果是混和式驗證 可以在 Invoke-Ssqlcmd 帶入 SQL -username , -password , 如果是Windows 驗證,就不用帶 -username , -password  ,而是
    你執行 powersehll 的 windows 帳號密碼送到 SQL Server

    我用另一個 SERVERPROPERTY 的方式查詢版本,寫了一個範例提供你參考。

    $remote_sql =Get-Content C:\Intel\sql.txt
    foreach ($server in $remote_sql) {
    Write-Host Check $SERVER SQL Version 
    try {
    $SQLVERSION=Invoke-Sqlcmd "SELECT SERVERPROPERTY('productversion') AS ProductVersion,  SERVERPROPERTY ('productlevel')as Productlevel, SERVERPROPERTY ('edition') as Edition " -server  $server -Username  username -Password password
    if ($SQLVERSION.productversion -match '12.*') {$SQLVER='SQL 2014'}
    elseif ($SQLVERSION.productversion -match '11.*') {$SQLVER='SQL 2012'}
    elseif ($SQLVERSION.productversion -match '10.50*') {$SQLVER='SQL 2008 R2'}
    elseif ($SQLVERSION.productversion -match '10.00*') {$SQLVER='SQL 2008'}
    elseif ($SQLVERSION.productversion -match '9.*' ) {$SQLVER='SQL 2005'}
    elseif ($SQLVERSION.productversion -match '8.*' ) {$SQLVER='SQL 2000'}
    elseif ($SQLVERSION.productversion -match '7.*' ) {$SQLVER='SQL 7.0'}
    elseif ($SQLVERSION.productversion -match '6.50.*' ) {$SQLVER='SQL 6.5'}
    else {$SQLVER='Unknow'}
    
    $Result=$SERVER + ' ' + $SQLVER + ' ' + $SQLVERSION.edition + ' ' + $SQLVERSION.productlevel + ' ' + $SQLVERSION.productversion
    
    $Result |Out-File -Append  C:\Intel\SQLVersion.txt
    }
    catch {
    $ERR = $_.Exception.Message 
    $Result= $SERVER + ' ' + $ERR
    $Result |Out-File -Append  C:\Intel\SQLVersion.txt
    }
    
    }





    • 已標示為解答 豬肉榮_TW 2016年5月11日 上午 12:53
    • 已編輯 William-IT 2016年5月11日 上午 01:08
    2016年5月10日 上午 03:22

所有回覆

  • 1. SQL Server 無法連線應該會有錯誤,
    2. 執行的權限跟有沒有以管理者權限"的方式進行開啟
    3. 能不能查詢到跟你的 SQL Server 驗證方式有關, 如果是混和式驗證 可以在 Invoke-Ssqlcmd 帶入 SQL -username , -password , 如果是Windows 驗證,就不用帶 -username , -password  ,而是
    你執行 powersehll 的 windows 帳號密碼送到 SQL Server

    我用另一個 SERVERPROPERTY 的方式查詢版本,寫了一個範例提供你參考。

    $remote_sql =Get-Content C:\Intel\sql.txt
    foreach ($server in $remote_sql) {
    Write-Host Check $SERVER SQL Version 
    try {
    $SQLVERSION=Invoke-Sqlcmd "SELECT SERVERPROPERTY('productversion') AS ProductVersion,  SERVERPROPERTY ('productlevel')as Productlevel, SERVERPROPERTY ('edition') as Edition " -server  $server -Username  username -Password password
    if ($SQLVERSION.productversion -match '12.*') {$SQLVER='SQL 2014'}
    elseif ($SQLVERSION.productversion -match '11.*') {$SQLVER='SQL 2012'}
    elseif ($SQLVERSION.productversion -match '10.50*') {$SQLVER='SQL 2008 R2'}
    elseif ($SQLVERSION.productversion -match '10.00*') {$SQLVER='SQL 2008'}
    elseif ($SQLVERSION.productversion -match '9.*' ) {$SQLVER='SQL 2005'}
    elseif ($SQLVERSION.productversion -match '8.*' ) {$SQLVER='SQL 2000'}
    elseif ($SQLVERSION.productversion -match '7.*' ) {$SQLVER='SQL 7.0'}
    elseif ($SQLVERSION.productversion -match '6.50.*' ) {$SQLVER='SQL 6.5'}
    else {$SQLVER='Unknow'}
    
    $Result=$SERVER + ' ' + $SQLVER + ' ' + $SQLVERSION.edition + ' ' + $SQLVERSION.productlevel + ' ' + $SQLVERSION.productversion
    
    $Result |Out-File -Append  C:\Intel\SQLVersion.txt
    }
    catch {
    $ERR = $_.Exception.Message 
    $Result= $SERVER + ' ' + $ERR
    $Result |Out-File -Append  C:\Intel\SQLVersion.txt
    }
    
    }





    • 已標示為解答 豬肉榮_TW 2016年5月11日 上午 12:53
    • 已編輯 William-IT 2016年5月11日 上午 01:08
    2016年5月10日 上午 03:22
  • 謝謝你提供的語法.....

    有個小地方要修改.....就是10.5版是SQL2008 R2;10.0版是SQL2008

    2016年5月11日 上午 12:54
  • 感謝提醒,已修改正確。
    2016年5月11日 上午 01:09