2015-01-19 2 views
1

Мы пытаемся автоматизировать большое количество наших задач обслуживания Azure/обслуживания, используя комбинацию очередей Azure Service Bus и Azure Worker Roles. Короче говоря, концепция выглядит следующим образом ....Установить WSManConnection с ролью Azure Worker

  1. задача технического обслуживание размещена С.Б. очередь
  2. Worker роль прослушивает задачи на
  3. Worker роли SB Queue подключается к желаемому VM/веб-роли/Облачный сервис и выполняет команду удаленной команды powershell

На практике это работает, как ожидается, при работе в среде разработки, однако после публикации рабочей роли соединение с удаленной связью завершается с ответом «Доступ лишен». Код, чтобы установить соединение следующим образом ...

PSCredential cred = new PSCredential(config.Username, config.PrimaryPassword); 
WSManConnectionInfo connection = new WSManConnectionInfo(true, config.PrimaryServer, 5986, "/wsman", "http://schemas.microsoft.com/powershell/Microsoft.PowerShell", cred); 

using (Runspace runspace = RunspaceFactory.CreateRunspace(connection)) 
{ 
    runspace.Open(); 
    using (PowerShell shell = PowerShell.Create()) 
    { 
     shell.Runspace = runspace; 
     // DO SOMETHING HERE 
     shell.Invoke(); 
    } 
    runspace.Close(); 
} 

Первоначально, я подозревал, что это был вопрос сертификат CA, однако я с тех пор связан с ролью работника через RDP и подтвердил, что сертификаты в настоящее время развернуто правильно. Кроме того, мне также удалось установить соединение с целевым сервером с помощью команды «winrs -r:», также используя соединение удаленного рабочего стола.

В качестве подтверждения рабочая роль также выполняется с повышенными разрешениями.

Любая помощь с этим была бы оценена

Заранее спасибо

ответ

0

После большого количества экспериментов, казалось бы, что Runspace.Open() команда должна выполняться под учетной записью с правами администратора (выполнение рабочей роли с повышенными разрешениями не достигает этого), поэтому для решения проблемы я сделал следующее ...

Используя задачу запуска роли, я создал учетную запись, используя следующую команду ...

net user roleusername rolepassword /add 
net localgroup Administrators roleusername /add 
exit /B 0 

Затем я выдал себя за пользователя со следующим кодом, чтобы гарантировать, что роль запущена как недавно созданная учетная запись локального администратора.

[DllImport("advapi32.DLL", SetLastError = true)] 
public static extern int LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr phToken); 

[DllImport("advapi32.DLL")] 
public static extern bool ImpersonateLoggedOnUser(IntPtr hToken); 

[DllImport("advapi32.DLL")] 
public static extern bool RevertToSelf(); 

public static object Impersonate(string username, string password) 
{ 
    string domainname = "."; 
    if (username.Contains(@"\")) 
    { 
     domainname = username.Substring(0, username.IndexOf(@"\")); 
     username = username.Substring(username.IndexOf(@"\") + 1); 
    } 

    IntPtr securityToken; 

    LogonUser(username, domainname, password, 9, 0, out securityToken); 
    if (securityToken != IntPtr.Zero) 
    { 
     var newIdentity = new WindowsIdentity(securityToken); 
     WindowsImpersonationContext impersonationContext = newIdentity.Impersonate(); 

     return impersonationContext; 
    } 

    throw new InvalidOperationException("The username or password combination was invalid, please verify your settings"); 
} 

public static void UndoImpersonation(object impersonationContext) 
{ 
    var context = impersonationContext as WindowsImpersonationContext; 
    if (context != null) context.Undo(); 
} 

Я надеюсь, что это поможет кому-то еще столкнуться с той же проблемой.

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