需搭配 Connect-AzAccount with Saved Encryped Credential in Powershell 實現自動化
	Param (
		    [String]$VMName = ''
	);
	if ($VMName -eq '') {
		    exit;
	};
	Set-Location -Path ('C:\ChangeVMPublicIP');
	if (Test-Path -Path (($VMName) + '.Lock')) {
		    if ((Get-Date) -lt (Get-Item -Path (($VMName) + '.Lock')).LastWriteTime.AddMinutes(5)) {
			        write-Host 'VM Locked';
			        exit;
		    };
	};
	$VMName | Out-File (($VMName) + '.Lock');
	$CredentailFileName = 'AzCredential.txt';
	$AzSubscriptionID = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx';
  
	##### Connect to Azure
		[string[]]$CredentialRead = Get-Content -Path $CredentailFileName;
		$UserName = [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($CredentialRead[0]));
		$Password = $CredentialRead[1] | ConvertTo-SecureString -Key (1..16)
		$Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $UserName, $Password;
		$ConnectAzAccount = Connect-AzAccount -Credential $Credential -Subscription $AzSubscriptionID;
	##### Connect to Azure
	$ScriptStartTime = (Get-Date).ToUniversalTime().AddHours(8).ToString('yyyy-MM-dd HH:mm:ss');
	$DateTimeString = (Get-Date).ToUniversalTime().AddHours(8).ToString('yyyyMMdd HHmmss')
	$TranscriptLog = (Get-Item -Path ".\" -Verbose).FullName + "\Logs\" + ("ChangeVMPublic " + $DateTimeString + ".log")
	$StartLog = start-transcript -path $TranscriptLog;
	$VM = Get-AzVM -Name $VMName;
	if ($VM -eq $Null) {
		    exit;
	};
	$NIC = Get-AzNetworkInterface -ResourceId $VM.NetworkProfile.NetworkInterfaces.Id;
	$Subnet = Get-AzVirtualNetworkSubnetConfig -ResourceId $NIC.IpConfigurations.Subnet.Id;
	$PublicIP = Get-AzPublicIpAddress | where {$_.Id -eq $NIC.IpConfigurations.PublicIpAddress.Id};
	if ($PublicIP -eq $Null) {
		    exit;
	};
	$OldPublicIPAddress = $PublicIP.IpAddress;
	$NewPublicIPAddress = $PublicIP.IpAddress;
	while ($NewPublicIPAddress -eq $OldPublicIPAddress) {
		    $NIC.IpConfigurations.publicipaddress.id = $Null;
		    $SetNIC = Set-AzNetworkInterface -NetworkInterface $NIC;
		    $SetNIC = $NIC | Set-AzNetworkInterfaceIpConfig -Name $NIC.IpConfigurations.Name -PublicIPAddress $PublicIP -Subnet $Subnet;
		    $SetNIC = $NIC | Set-AzNetworkInterface;
		    $PublicIP = Get-AzPublicIpAddress | where {$_.Id -eq $NIC.IpConfigurations.PublicIpAddress.Id};
		    $NewPublicIPAddress = $PublicIP.IpAddress;
		    write-host ('Public IP Address of ' + $VMName + ' has been changed from ' + $OldPublicIPAddress  + ' to ' + $NewPublicIPAddress);
	};
	Write-Host ('Script execution time: ' + [math]::Round((New-TimeSpan -Start $ScriptStartTime -End (Get-Date).ToUniversalTime().AddHours(8).ToString('yyyy-MM-dd HH:mm:ss')).TotalSeconds) + ' Seconds');
	$EndLog = stop-transcript;
	if (Test-Path -Path (($VMName) + '.Lock')) {
		    Remove-Item -Path (($VMName) + '.Lock') -Confirm:$False;
		    exit;
	};
	
沒有留言:
張貼留言