2012-06-01 2 views
0

Пытается написать сценарий мониторинга (Powershell) для нашего SMTP-кластера, в котором есть три узла, время от времени записывающих.Доступ запрещен при удаленной попытке с Get-NlbClusterNode

Когда я локально, на SMTP-кластера выполните следующую команду:

Get-NlbClusterNode 

Я получаю вывод, что нужно.

Но если попробовать то же самое с удаленного сервера (такой же сети и домена) я получаю:

[smtp-s001a]: PS C:\> Get-NlbClusterNode 
Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)) 
+ CategoryInfo   : 
+ FullyQualifiedErrorId : 
AccessDenied,Microsoft.NetworkLoadBalancingClusters.PowerShell.GetNlbClusterNode 

Почему? Это ТОЛЬКО команда «Get-NlbClusterNODE», которая дает мне доступ, запрещена. «Get-NlbCluster» для примера работает отлично.

Любые советы?

+0

Вы должны подключиться к кластеру, используя имя входа, входящего в группу «Администраторы» на всех хостах. –

+0

Привет, Дэвид и большое спасибо за ваш ответ. Я подключаюсь как администратор домена (который является членом группы локальных администраторов на каждом узле). Такая же учетная запись используется удаленно при входе в систему локально, где она работает локально. Любые другие мысли? С наилучшими пожеланиями – user1281991

ответ

0

У меня была та же проблема.

Пришло время разобраться. Я запускал Powershell как процесс с моей службы. Служба работает под одной учетной записью пользователя на всех хостах, но пароль генерируется случайным образом на каждом узле хоста/кластера, поэтому я получил «Access Denied ...». Когда я меняю пароль на то же, все работает нормально.

0

Я нашел некоторое обходное решение. Impersonate с админ credentional в удаленном сеансе

function EntryPoint() 
{ 
    ImportModule-Impersonate; 

    $impersonate = new-object UserSession.Impersonate; 
    try 
    { 
     if ($impersonate.Login("SKODA", "Administrator", "*****") -eq $false) { 
      throw new Exception("Invalid credentials"); 
     } 
     Import-Module NetworkLoadBalancingClusters 
     Get-NlbClusterNode;  
    } 
    finally 
    { 
     $impersonate.Dispose(); 
    } 
}; 

function ImportModule-Impersonate { 

$assem = @(); 

$source = @" 
using System; 
using System.Collections.Generic; 
using System.Runtime.InteropServices; 
using System.Security.Principal; 
using System.Text; 

namespace UserSession 
{ 
    public class Impersonate : IDisposable 
    { 
     public const int LOGON32_LOGON_INTERACTIVE = 2; 
     public const int LOGON32_PROVIDER_DEFAULT = 0; 

     private WindowsImpersonationContext _impersonationContext; 

     [DllImport("advapi32.dll")] 
     public static extern int LogonUserA(String lpszUserName, 
              String lpszDomain, 
              String lpszPassword, 
              int dwLogonType, 
              int dwLogonProvider, 
              ref IntPtr phToken); 

     [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     public static extern int DuplicateToken(IntPtr hToken, 
               int impersonationLevel, 
               ref IntPtr hNewToken); 

     [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     public static extern bool RevertToSelf(); 

     [DllImport("kernel32.dll", CharSet = CharSet.Auto)] 
     public static extern bool CloseHandle(IntPtr handle); 

     public bool Login(String domain, String userName, String password) 
     { 
      IntPtr token = IntPtr.Zero; 
      IntPtr tokenDuplicate = IntPtr.Zero; 

      if (RevertToSelf()) 
      { 
       if (LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE, 
           LOGON32_PROVIDER_DEFAULT, ref token) != 0) 
       { 
        if (DuplicateToken(token, 2, ref tokenDuplicate) != 0) 
        { 
         WindowsIdentity tempWindowsIdentity = new WindowsIdentity(tokenDuplicate); 
         _impersonationContext = tempWindowsIdentity.Impersonate(); 

         if (_impersonationContext != null) 
         { 
          CloseHandle(token); 
          CloseHandle(tokenDuplicate); 
          return true; 
         } 
        } 
       } 
      } 
      if (token != IntPtr.Zero) 
      { 
       CloseHandle(token); 
      } 
      if (tokenDuplicate != IntPtr.Zero) 
      { 
       CloseHandle(tokenDuplicate); 
      } 
      return false; 
     } 

     public void Logout() 
     { 
      if (_impersonationContext != null) 
      { 
       _impersonationContext.Undo(); 
       _impersonationContext = null; 
      } 
     } 

     public void Dispose() 
     { 
      Logout(); 
     } 
    } 
} 
"@; 

    Add-Type -ReferencedAssemblies $assem -TypeDefinition $source -Language CSharp 
} 

EntryPoint; 
0

Также отключить контроль учетных записей и перезагрузите машину.

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