与许多人一样,我们拥有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搜索和试错来找到解决方案。非常感谢!
本
答案 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”)