Powershell 调用阿里云 云解析API 实现动态域名解析

由于阿里云解析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

原文地址:http://blog.51cto.com/6293080/2313946

时间: 2024-12-13 07:32:36

Powershell 调用阿里云 云解析API 实现动态域名解析的相关文章

如何使用阿里云云解析API实现动态域名解析,搭建私有服务器

原文地址:http://www.yxxrui.cn/article/116.shtml 未经许可请勿转载,如有疑问,请联系作者:[email protected] 公司的网络没有固定的公网IP地址,但是能够保证的是,每次动态分配的IP地址均为独立的公网IP,只是每次分配后会在1-2天后更换,或者重启路由器后更换,为了能够把这个公网IP利用起来,大家常用的是使用花生壳之类的软件来操作,我使用过花生壳的多款产品,挺好的,就是有一下几个缺点: 1.需要使用花生壳上购买的域名才行,或者使用免费的可域名,

采用阿里的API进行动态域名解析

#!/usr/bin/env python # -*- coding:utf-8 -*- import os from aliyunsdkcore import client from aliyunsdkcore.request import RpcRequest product="Domain" version="2016-05-11" accesskey="XXXXXXXXXXXXXXXXXXXX" #请替换成自己的accesskey acc

Python 调用阿里云 API 收集 ECS 数据

#!/usr/bin/env python # coding: utf-8 # author: Wang XiaoQiang ''' 功能介绍: 1.调用阿里云API,收集所有区域 ECS 信息 2.将需要的数据整理.生成 Excel 文档 3.关于阿里 sdk 的安装,api 的调用请参考阿里云官网 4.xlsxwriter 请参考这里:http://xlsxwriter.readthedocs.org/ ''' import json, sys try: from termcolor imp

五:用JAVA写一个阿里云VPC Open API调用程序

用JAVA写一个阿里云VPC Open API调用程序 摘要:用JAVA拼出来Open API的URL 引言 VPC提供了丰富的API接口,让网络工程是可以通过API调用的方式管理网络资源.用程序和软件管理自动化管理网络资源是一件显著提升运维效率和网络生产力的事情.产品经理教你写代码系列文章的目标是不懂代码的网络工程师能一步一步的学会用API管理网络. 另外通过文章标题大家也可以看出来,产品经理教你写代码肯定是一个业余班,里面的代码很多写的都不规范,可能也有很多Bug.专业选手可以参考的有限,请

零基础大数据入门教程:Java调用阿里云短信通道服务

这里我们使用SpringBoot 来调用阿里通信的服务. 阿里通信,双11.收到短信,日发送达6亿条.保障力度非常高. 使用的步骤: 1.1. 第一步:需要开通账户 1.2. 第二步:阅读接口文档 1.2.1. 秘钥管理 1.2.2. 短信签名 1.2.3. 短信模板 1.3. SDK 这个由阿里云提供. 编译与打包. 打包到本地仓库,或者公司局域网内的私服地址. Maven打包 1.4. 第三步:创建SpringBoot工程,导入依赖 <!-- sms单独打包 --> <depende

php5.2版本如何成功调用腾讯云短信API,实现短信发送功能

一.简要说明 我们在生活中经常会遇到一种情况,当你注册某个平台账户时,只要输入你的手机号码,点击获取验证码,随后就会收到发给你的短信验证码. 一般来说,实现这种功能都是用阿里云或者腾讯云提供的云短信服务.价格也很便宜,1000条起订,每条0.005元.因为公司的业务需求,最近需要实现这个功能,经过了解后决定使用腾讯云的云短信服务.(其实两个平台价格差不多,但是腾讯云首次开启会免费赠送100条短信,非常适合前期测试,所以理所当然选择了腾讯云.) 在官方的文档中提供了C#,node.js,Java,

阿里IoT云VS腾讯IoT云,相互抄袭还是一女俩嫁?

最近评估各个IoT云的可用性,首先验证了阿里IoT云,功能特性不是很满意;接下来又验证了腾讯IoT云.之前阿里云验证过程中曲折难做,反倒是腾讯IoT云一路顺风顺水,很快就调试验证完成.不过验证过程中发现了一些蹊跷,俩大对头云在IoT部分的架构/实现 甚至代码都存在惊人的相似,不禁心生疑问,到底是东风抄袭了西风还是西风抄袭了东风?亦或是创业公司一女俩嫁? 版本号相似 编译Makefile基本一致 编译宏/特性定义基本一致 API接口定义基本一致 下面看下每个具体的条目,诸位看官也分辨下雌雄:版本号

向淘宝生态圈看齐——阿里云“云合计划”

名篇<过秦论>中有"斩木为兵,揭竿为旗,天下云合响应,赢粮而景从"之名句,而阿里云着力打造的"云合计划"意图十分明显:快速聚集合作伙伴,构建新的云生态体系,在DT时代,加快传统行业向云的转变. 围绕着淘宝这个平台,十年间诞生了数十种新职业.数十万家电商服务企业和数百万的网商,形成了遍布国内每个乡镇的快递网络,而有望达到万亿元级规模的云服务市场,也需要一个这样的生态圈,一方面加速传统行业向云计算转型,另一方面,可以催生出具有世界级水平的新型软件公司.这就是

使用python调用windows azure 云存储服务

前几天自己看了python,心痒痒,然后使用python来调用Windows azure云存储. 参考文章: 使用python调用windows azure 云存储服务 安装python 我在按照文章内容安装完python sdk for azure后,直接通过python编辑器调试. 在导入azure包时,未报错. from azure.storage import * 在执行BlobService对象时,未报错. blob_service = BlobService(account_name