销毁/重新创建VM后,Azure DNS出现问题

时间:2013-08-02 18:56:14

标签: azure dns azure-virtual-machine

与许多人一样,我们拥有Azure VM,我们希望在不使用时销毁它们,这样我们就不必为其核心使用付费。所讨论的所有VM都在同一个域上,并且DC / DNS服务器永远不会被销毁/重新创建并具有静态IP。但是,成功使用Export / Remove / Import-AzureVM的组合后,网络适配器的所有IP设置(DNS是我主要关注的)都消失了,因为每次使用Import-重建VM时都会创建一个新的网络适配器AzureVM。

我最初尝试使用NETSH在启动时设置我的DNS条目,但这取决于知道适配器的名称和适配器名称每天都在变化(因为我们在晚上将机器关闭并在早上重新创建它们)。我的下一个不那么出色的想法是包含一个VBScript,它在启动时将适配器重命名为相同的名称,以便NETSH始终具有相同的适配器名称来处理。然而,正是在这一点上,我发现所有旧的适配器仍然存在,但只是隐藏而不使用,使我的计划没有实际意义。

以下是我试图使用的测试NETSH命令和VBScript,仅供参考:

'this script was modified from one i got from the Scripting Guys
Const NETWORK_CONNECTIONS = &H31&

Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace(NETWORK_CONNECTIONS)

Set colItems = objFolder.Items
For Each objItem in colItems  
'only one adapter is ever returned by this query, but it didn't seem like a bad idea to leave the loop alone just in case      
        objItem.Name = "testlan"
    wscript.echo objItem.Name
Next

NETSH

netsh interface ip add dns name="testlan" 10.0.0.4 

我知道我不可能是唯一一个试图解决这个问题的人,但是我一直无法通过大量的Google搜索和试错来找到解决方案。非常感谢!

2 个答案:

答案 0 :(得分:0)

@Nathan的评论不正确。当VM被“停止”时,它仍然被计费。如果是“已停止(取消分配)”,则结算将停止。来自Azure's Pricing Details FAQ

  

要确保您不需要付费,请从管理中停止VM   门户。您也可以通过调用Powershell来停止VM   ShutdowRoleOperation与'PostShutdownAction'相等   “StoppedDeallocated”。但是,如果您继续收费,您将继续收费   从内部关闭VM(例如,使用Windows中的电源选项)或   通过PowerShell调用ShutdownRoleOperation   'PostShutdownAction'等于“已停止”。

您可以使用Azure控制面板进入解除分配状态,或使用Azure Cmdlet强制停止VM,而不是销毁VM。这将解除分配,你不会遇到网络问题。不幸的是,目前无法通过REST Api完成。

我在应用中使用以下内容来停止服务:

RunPowerShellScript(@"Stop-AzureVM -ServiceName " + cloudServiceName + " -Name " + vmName + " -Force");

在按钮上使用该行,或使用REST api查询您的云服务,然后使用以下函数运行您的PowerShell。请务必最初运行getting started

private string RunPowerShellScript(string scriptText)
        {
            // create Powershell runspace
            Runspace runspace = RunspaceFactory.CreateRunspace();
            // open it
            runspace.Open();
            // create a pipeline and feed it the script text
            Pipeline pipeline = runspace.CreatePipeline();
            pipeline.Commands.AddScript(scriptText);
            // add an extra command to transform the script
            // output objects into nicely formatted strings
            // remove this line to get the actual objects
            // that the script returns. For example, the script
            // "Get-Process" returns a collection
            // of System.Diagnostics.Process instances.
            pipeline.Commands.Add("Out-String");
            // execute the script
            Collection<PSObject> results = pipeline.Invoke();
            // close the runspace
            runspace.Close();
            // convert the script result into a single string

            StringBuilder stringBuilder = new StringBuilder();
            foreach (PSObject obj in results)
            {
                stringBuilder.AppendLine(obj.ToString());
            }
            return stringBuilder.ToString();
        }

答案 1 :(得分:0)

试试这个......

Set-ExecutionPolicy Unrestricted


$ wmi = Get-WmiObject win32_networkadapterconfiguration -filter“ipenabled ='true'”


$ wmi.SetDNSServerSearchOrder( “10.0.2.6”)