Powershell 調用阿裏雲 雲解析API 實現動態域名解析
阿新 • • 發佈:2018-11-07
access 沒有 2.3 response 符號 oba res ttl upper 由於阿裏雲解析API調用官方文檔中沒有Powershell的示例腳本,而API接口調用實際是通過向DNS API的服務端地址發送HTTP POST或GET請求,因此根據官方文檔寫了相關的函數用於查詢域名解析、修改域名解析的狀態。如果要增刪域名解析,參考官方文檔修改函數中的Action等參數即可。
參考的阿裏API調用鏈接:https://help.aliyun.com/document_detail/29743.html?spm=a2c4g.11186623.6.614.35f94c7bRwGbqZ
function GetAliDnsInfo { <# .Synopsis 獲取阿裏雲解析的域名解析 GetAliDnsInfo -SubDomain ceshi.domain.cn | ft #> param( [Parameter(Mandatory=$true)] $SubDomain ) $array = New-Object -TypeName System.Collections.ArrayList $Action = "DescribeSubDomainRecords" $array.Add(@("SubDomain",$SubDomain)) | Out-Null $array.Add(@("Action",$Action)) | Out-Null $array.Add(@("PageNumber","1")) | Out-Null $array.Add(@("PageSize","20")) | Out-Null #region 生成公共參數 $AccessKeyId = "AccessKeyId" #填寫你的AccessKeyId $AccessKeySecret = "AccessKeySecret&" #填寫你的AccessKeySecret並在末尾添加&符號,如secret是1,那麽這裏值應該是1& $Format = "XML" $SignatureMethod="HMAC-SHA1" $SignatureVersion="1.0" $Version="2015-01-09" $time = (get-date).AddHours(-8).AddMinutes(2) $Timestamp = get-date $time -Format yyyy-MM-ddTHH:mm:ssZ $SignatureNonce= Get-Random $array.Add(@("AccessKeyId",$AccessKeyId)) | Out-Null $array.Add(@("Format",$Format)) | Out-Null $array.Add(@("Timestamp",$Timestamp)) | Out-Null $array.Add(@("SignatureNonce",$SignatureNonce)) | Out-Null $array.Add(@("SignatureMethod",$SignatureMethod)) | Out-Null $array.Add(@("SignatureVersion",$SignatureVersion)) | Out-Null $array.Add(@("Version",$Version)) | Out-Null #endregion #region 生成轉義請求字符串 $newarray = $array | sort $csstring = $null foreach($arr in $newarray) { $csstring += $arr[0] + "=" + $arr[1] + "&" } $length = $csstring.Length - 1 $string = $csstring.Substring(0,$length) [Reflection.Assembly]::LoadWithPartialName("System.Web") | Out-Null $newstring = "GET&%2F&" $length = $string.Length for($i = 0 ; $i -lt $length; $i++){ $char = $string[$i].ToString() $pattern = "[A-Z,0-9-_.~]" $flag = $char -match $pattern if($flag){ $newstring += $char }else{ if($char -eq " " -or $char -eq ":"){ if($char -eq " "){ $newstring += "%20" }else{ $newstring += "%253A" } }else{ $newstring += [Web.HttpUtility]::UrlEncode($char).ToUpper() } } } #endregion #region 生成簽名 $hmacsha1 = new-object System.Security.Cryptography.HMACSHA1; $hmacsha1.Key = [System.Text.Encoding]::UTF8.GetBytes($AccessKeySecret); $oauth_signature = [System.Convert]::ToBase64String($hmacsha1.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($newstring))); #$oauth_signature $newstring = $null$length = $oauth_signature.Length for($i = 0 ; $i -lt $length; $i++){ $char = $oauth_signature[$i].ToString() $pattern = "[A-Z,0-9-_.~]" $flag = $char -match $pattern if($flag){ $newstring += $char }else{ if($char -eq " " -or $char -eq ":"){ if($char -eq " "){ $newstring += "%20" }else{ $newstring += "%253A" } }else{ $newstring += [Web.HttpUtility]::UrlEncode($char).ToUpper() } } } $oauth_signature = $newstring #endregion #region 生成URL $array.Add(@("Signature",$oauth_signature)) | Out-Null $newarray = $array | sort $csstring = $null foreach($arr in $newarray){ $csstring += $arr[0] + "=" + $arr[1] + "&" } $length = $csstring.Length - 1 $string = $csstring.Substring(0,$length) $webrequest = "http://alidns.aliyuncs.com/?" + $string #endregion #region 篩選出信息 $Error.Clear() $body = Invoke-WebRequest -Uri $webrequest -Method Get if($Error){ return $null }else{ $xmldata = [xml]($body.Content) $records = $xmldata.DescribeSubDomainRecordsResponse.DomainRecords.Record return $records } #endregion } function SetAliDnsStatus { <# .Synopsis 修改已有的阿裏雲解析狀態 SetAliDnsStatus -SubDomain ceshi.domain.cn -statu 0 -line os_namerica_us | ft 參數line 表示線路,阿裏雲支持智能解析,比如亞洲用戶解析到IP地址A,美國解析到IP地址B。 參數statu表示狀態,1啟用,0禁用 #> param( [Parameter(Mandatory=$true)] $SubDomain, [Parameter(Mandatory=$true)] [ValidateSet("1","0")] $statu, [Parameter(Mandatory=$false)] [ValidateSet("default","os_asia","os_euro","os_namerica_us","os_oceanica_au","os_namerica_us","os_oceanica_au","mobile","unicom")] $line = 0, [Parameter(Mandatory=$false)] $ip = 0 ) $oldrecords = $null if($line -or $ip){ if($line){ $oldrecords = GetAliDnsInfo $SubDomain | where{$_.line -eq $line} } if($ip){ $oldrecords = GetAliDnsInfo $SubDomain | where{$_.Value -eq $ip} } if($line -and $ip){ $oldrecords = GetAliDnsInfo $SubDomain | where{$_.Value -eq $ip} | where{$_.line -eq $line} } }else{ $oldrecords = GetAliDnsInfo $SubDomain } if($oldrecords){ $Change = New-Object -TypeName System.Collections.ArrayList [Reflection.Assembly]::LoadWithPartialName("System.Web") | Out-Null $newoldrecords = $oldrecords | sort Value foreach($record in $newoldrecords){ #region 需要修改的記錄 $RecordId = $record.RecordId $array = New-Object -TypeName System.Collections.ArrayList if($statu -eq 1){ $Status = "ENABLE" } if($statu -eq 0){ $Status = "Disable" } $Action = "SetDomainRecordStatus" $array.Add(@("RecordId",$RecordId))| Out-Null $array.Add(@("Action",$Action))| Out-Null $array.Add(@("Status",$Status))| Out-Null #region 創建公共參數 $AccessKeyId = "AccessKeyId" #填寫你的AccessKeyId $AccessKeySecret = "AccessKeySecret&" #填寫你的AccessKeySecret並在末尾添加&符號,如secret是1,那麽這裏值應該是1& $Format = "XML" $SignatureMethod="HMAC-SHA1" $SignatureVersion="1.0" $Version="2015-01-09" $time = (get-date).AddHours(-8) $Timestamp = get-date $time -Format yyyy-MM-ddTHH:mm:ssZ $SignatureNonce= Get-Random $array.Add(@("AccessKeyId",$AccessKeyId)) | Out-Null $array.Add(@("Format",$Format))| Out-Null $array.Add(@("Timestamp",$Timestamp))| Out-Null $array.Add(@("SignatureNonce",$SignatureNonce))| Out-Null $array.Add(@("SignatureMethod",$SignatureMethod))| Out-Null $array.Add(@("SignatureVersion",$SignatureVersion))| Out-Null $array.Add(@("Version",$Version))| Out-Null #endregion #region 轉義請求字符串 $newarray = $array | sort $csstring = $null foreach($arr in $newarray){ $csstring += $arr[0] + "=" + $arr[1] + "&" } $length = $csstring.Length - 1 $string = $csstring.Substring(0,$length) $newstring = "GET&%2F&" $length = $string.Length for($i = 0 ; $i -lt $length; $i++){ $char = $string[$i].ToString() $pattern = "[A-Z,0-9-_.~]" $flag = $char -match $pattern if($flag){ $newstring += $char }else{ if($char -eq " " -or $char -eq ":"){ if($char -eq " "){ $newstring += "%20" }else{ $newstring += "%253A" } }else{ $newstring += [Web.HttpUtility]::UrlEncode($char).ToUpper() } } } #endregion #region 生成簽名 $hmacsha1 = new-object System.Security.Cryptography.HMACSHA1; $hmacsha1.Key = [System.Text.Encoding]::UTF8.GetBytes($AccessKeySecret); $oauth_signature = [System.Convert]::ToBase64String($hmacsha1.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($newstring))); #$oauth_signature $newstring = $null $length = $oauth_signature.Length for($i = 0 ; $i -lt $length; $i++){ $char = $oauth_signature[$i].ToString() $pattern = "[A-Z,0-9-_.~]" $flag = $char -match $pattern if($flag){ $newstring += $char }else{ if($char -eq " " -or $char -eq ":"){ if($char -eq " "){ $newstring += "%20" }else{ $newstring += "%253A" } }else{ $newstring += [Web.HttpUtility]::UrlEncode($char).ToUpper() } } } $oauth_signature = $newstring #endregion #region 生成URL $array.Add(@("Signature",$oauth_signature)) | Out-Null $newarray = $array | sort $csstring = $null foreach($arr in $newarray){ $csstring += $arr[0] + "=" + $arr[1] + "&" } $length = $csstring.Length - 1 $string = $csstring.Substring(0,$length) $webrequest = "http://alidns.aliyuncs.com/?" + $string #endregion #region 獲取結果 $Error.Clear() $body = Invoke-WebRequest -Uri $webrequest -Method Get if($Error){ $Errortxt = $Error | Out-String $obj = New-Object psobject $obj | Add-Member -MemberType NoteProperty -Name RequestId -Value $null $obj | Add-Member -MemberType NoteProperty -Name RecordId -Value $RecordId $obj | Add-Member -MemberType NoteProperty -Name Status -Value $null $obj | Add-Member -MemberType NoteProperty -Name Error -Value $Errortxt $Change.Add($obj) | Out-Null }else{ $xmldata = [xml]($body.Content) $obj = $xmldata.SetDomainRecordStatus $Change.Add($obj) | Out-Null } #endregion #endregion } $oldrecords | Add-Member -MemberType NoteProperty -Name Info -Value "Old" $newrecords = $null if($line -or $ip){ if($line){ $newrecords = GetAliDnsInfo $SubDomain | where{$_.line -eq $line} } if($ip){ $newrecords = GetAliDnsInfo $SubDomain | where{$_.Value -eq $ip} } if($line -and $ip){ $newrecords = GetAliDnsInfo $SubDomain | where{$_.Value -eq $ip} | where{$_.line -eq $line} } }else{ $newrecords = GetAliDnsInfo $SubDomain } if($newrecords){ $newrecords | Add-Member -MemberType NoteProperty -Name Info -Value "New" } $userlist = New-Object -TypeName System.Collections.ArrayList $userlist.Add($Change) | Out-Null $userlist.Add($oldrecords) | Out-Null $userlist.Add($newrecords) | Out-Null return $userlist }else{ $content = $SubDomain + "查無此解析" return $content } }
示例1:使用GetAlidnsInfo命令查詢mail.domain.cn的解析
PS C:\Users\xxx\Desktop> GetAliDnsInfo mail.domain.cn | ft RR Status Value Weight RecordId Type DomainName Locked Line TTL -- ------ ----- ------ -------- ---- ---------- ------ ---- --- mail ENABLE 111.222.333.44 1 311137911111416 A domain.cn false default 3600
示例2:禁用test.domain.cn解析
PS C:\Users\xxx\Desktop> SetAliDnsStatus test.domain.cn 0 | ft Info RR Status Value Weight RecordId Type DomainName Locked Line ---- -- ------ ----- ------ -------- ---- ---------- ------ ---- Old test ENABLE 1.1.1.1 1 111111111111 A domain.cn false default New test DISABLE 1.1.1.1 1 222222222222 A domain.cn false default
Powershell 調用阿裏雲 雲解析API 實現動態域名解析