2013-08-02 3 views
1

Как и многие люди, у нас есть Azure VM, которые мы хотим уничтожить, когда они не используются, поэтому нам не нужно платить за их основное использование. Все рассматриваемые виртуальные машины находятся в одном домене, а сервер DC/DNS никогда не уничтожается/не воссоздается и имеет статический IP-адрес. Однако, успешно используя комбинацию Export/Remove/Import-AzureVM, все настройки IP для сетевого адаптера (DNS - моя главная проблема) исчезли, потому что новый сетевой адаптер создается каждый раз при восстановлении виртуальной машины с помощью Import- AzureVM.Проблемы с Azure DNS после уничтожения/воссоздания VM

Первоначально я попробовал использовать 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 и проб и ошибок с моей стороны. Большое спасибо!

Ben

+1

Ben, Azure изменили свою модель выставления счетов, и вы больше не платите за виртуальные машины, которые существуют в состоянии «остановлено». Теперь вы можете просто закрыть их, и вы не будете платить. Я знаю, что это не ответ на ваш вопрос, но может быть более простым подходом. – Nathan

+0

Вам удалось найти решение на базе DNS? – paqogomez

ответ

0

@ Комментарий Н.Натана неверно. Когда виртуальная машина «Остановлена», она все еще объявляется. Если это «Остановлено (освобождено)», то тогда биллинг прекращается. От Azure's Pricing Details FAQ:

Чтобы убедиться, что вы не выставлен счет, остановить виртуальную машину из управления портала. Вы также можете остановить виртуальную машину через Powershell, вызвав ShutdowRoleOperation с «PostShutdownAction», равным «StoppedDeallocated». Тем не менее, вы по-прежнему будете выставлены на счет, если вы отключите виртуальную машину изнутри (например, используя параметры питания в Windows) или через PowerShell, вызывая ShutdownRoleOperation с «PostShutdownAction», равным «Stopped».

Вместо уничтожения виртуальной машины вы можете перейти в освобожденное состояние с помощью панели управления azure или использовать командлеты Azure, чтобы принудительно остановить виртуальную машину. Это освободит вас, и у вас не возникнут проблемы с сетью. К сожалению, этого нельзя сделать в настоящее время с 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(); 
     } 
0

Попробуйте это ...

Set-ExecutionPolicy Неограниченные


$ = Get WMI-WmiObject Win32_NetworkAdapterConfiguration -filter "ipenabled =" истинный"


$ wmi.SetDNSServerSearchOrder ("10.0.2.6")

Смежные вопросы