2008-08-15 34 views
11

Tôi đang cố gắng chạy lệnh powershell thông qua giao diện web (ASP.NET/C#) để tạo hộp thư/etc trên Exchange 2007. Khi tôi chạy trang bằng Visual Studio (Cassini), trang tải lên chính xác. Tuy nhiên, khi tôi chạy nó trên IIS (v5.1), tôi nhận được lỗi "tên người dùng không rõ hoặc mật khẩu xấu". Vấn đề lớn nhất mà tôi nhận thấy là Powershell đã đăng nhập dưới dạng ASPNET thay vì Tài khoản Thư mục Họat động của tôi. Làm cách nào để buộc phiên Powershell của tôi được xác thực bằng một Tài khoản Thư mục Họat động khác?Làm cách nào để bạn mạo danh người dùng Active Directory trong Powershell?

Về cơ bản, kịch bản mà tôi đã trông cho đến nay một cái gì đó như thế này:

RunspaceConfiguration rc = RunspaceConfiguration.Create(); 
PSSnapInException snapEx = null; 
rc.AddPSSnapIn("Microsoft.Exchange.Management.PowerShell.Admin", out snapEx); 

Runspace runspace = RunspaceFactory.CreateRunspace(rc); 
runspace.Open(); 

Pipeline pipeline = runspace.CreatePipeline(); 
using (pipeline) 
{ 
    pipeline.Commands.AddScript("Get-Mailbox -identity 'user.name'"); 
    pipeline.Commands.Add("Out-String"); 

    Collection<PSObject> results = pipeline.Invoke(); 

    if (pipeline.Error != null && pipeline.Error.Count > 0) 
    { 
     foreach (object item in pipeline.Error.ReadToEnd()) 
      resultString += "Error: " + item.ToString() + "\n"; 
    } 

    runspace.Close(); 

    foreach (PSObject obj in results) 
     resultString += obj.ToString(); 
} 

return resultString; 

Trả lời

1

Exchange 2007 không cho phép bạn mạo danh người dùng vì lý do bảo mật. Điều này có nghĩa là không thể (hiện tại) để tạo hộp thư bằng cách mạo danh người dùng. Để giải quyết vấn đề này, tôi đã tạo một dịch vụ web chạy dưới quyền người dùng AD có quyền tạo các tài khoản email, v.v. Sau đó, bạn có thể truy cập vào dịch vụ web này để truy cập vào PowerShell. Hãy nhớ thêm bảo mật cần thiết vì đây có thể là lỗ hổng bảo mật lớn.

7

Đây là lớp tôi sử dụng để mạo danh người dùng.

using System; 
using System.Data; 
using System.Configuration; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Web.UI.HtmlControls; 

namespace orr.Tools 
{ 

    #region Using directives. 
    using System.Security.Principal; 
    using System.Runtime.InteropServices; 
    using System.ComponentModel; 
    #endregion 

    /// <summary> 
    /// Impersonation of a user. Allows to execute code under another 
    /// user context. 
    /// Please note that the account that instantiates the Impersonator class 
    /// needs to have the 'Act as part of operating system' privilege set. 
    /// </summary> 
    /// <remarks> 
    /// This class is based on the information in the Microsoft knowledge base 
    /// article http://support.microsoft.com/default.aspx?scid=kb;en-us;Q306158 
    /// 
    /// Encapsulate an instance into a using-directive like e.g.: 
    /// 
    ///  ... 
    ///  using (new Impersonator("myUsername", "myDomainname", "myPassword")) 
    ///  { 
    ///   ... 
    ///   [code that executes under the new context] 
    ///   ... 
    ///  } 
    ///  ... 
    /// 
    /// Please contact the author Uwe Keim (mailto:[email protected]) 
    /// for questions regarding this class. 
    /// </remarks> 
    public class Impersonator : 
     IDisposable 
    { 
     #region Public methods. 
     /// <summary> 
     /// Constructor. Starts the impersonation with the given credentials. 
     /// Please note that the account that instantiates the Impersonator class 
     /// needs to have the 'Act as part of operating system' privilege set. 
     /// </summary> 
     /// <param name="userName">The name of the user to act as.</param> 
     /// <param name="domainName">The domain name of the user to act as.</param> 
     /// <param name="password">The password of the user to act as.</param> 
     public Impersonator(
      string userName, 
      string domainName, 
      string password) 
     { 
      ImpersonateValidUser(userName, domainName, password); 
     } 

     // ------------------------------------------------------------------ 
     #endregion 

     #region IDisposable member. 

     public void Dispose() 
     { 
      UndoImpersonation(); 
     } 

     // ------------------------------------------------------------------ 
     #endregion 

     #region P/Invoke. 

     [DllImport("advapi32.dll", SetLastError = true)] 
     private static extern int LogonUser(
      string lpszUserName, 
      string lpszDomain, 
      string lpszPassword, 
      int dwLogonType, 
      int dwLogonProvider, 
      ref IntPtr phToken); 

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

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

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

     private const int LOGON32_LOGON_INTERACTIVE = 2; 
     private const int LOGON32_PROVIDER_DEFAULT = 0; 

     // ------------------------------------------------------------------ 
     #endregion 

     #region Private member. 
     // ------------------------------------------------------------------ 

     /// <summary> 
     /// Does the actual impersonation. 
     /// </summary> 
     /// <param name="userName">The name of the user to act as.</param> 
     /// <param name="domainName">The domain name of the user to act as.</param> 
     /// <param name="password">The password of the user to act as.</param> 
     private void ImpersonateValidUser(
      string userName, 
      string domain, 
      string password) 
     { 
      WindowsIdentity tempWindowsIdentity = null; 
      IntPtr token = IntPtr.Zero; 
      IntPtr tokenDuplicate = IntPtr.Zero; 

      try 
      { 
       if (RevertToSelf()) 
       { 
        if (LogonUser(
         userName, 
         domain, 
         password, 
         LOGON32_LOGON_INTERACTIVE, 
         LOGON32_PROVIDER_DEFAULT, 
         ref token) != 0) 
        { 
         if (DuplicateToken(token, 2, ref tokenDuplicate) != 0) 
         { 
          tempWindowsIdentity = new WindowsIdentity(tokenDuplicate); 
          impersonationContext = tempWindowsIdentity.Impersonate(); 
         } 
         else 
         { 
          throw new Win32Exception(Marshal.GetLastWin32Error()); 
         } 
        } 
        else 
        { 
         throw new Win32Exception(Marshal.GetLastWin32Error()); 
        } 
       } 
       else 
       { 
        throw new Win32Exception(Marshal.GetLastWin32Error()); 
       } 
      } 
      finally 
      { 
       if (token != IntPtr.Zero) 
       { 
        CloseHandle(token); 
       } 
       if (tokenDuplicate != IntPtr.Zero) 
       { 
        CloseHandle(tokenDuplicate); 
       } 
      } 
     } 

     /// <summary> 
     /// Reverts the impersonation. 
     /// </summary> 
     private void UndoImpersonation() 
     { 
      if (impersonationContext != null) 
      { 
       impersonationContext.Undo(); 
      } 
     } 

     private WindowsImpersonationContext impersonationContext = null; 

     // ------------------------------------------------------------------ 
     #endregion 
    } 
} 
1

Bạn có thể cần bản vá.

Từ: http://support.microsoft.com/kb/943937

Một ứng dụng không thể mạo danh một người dùng và sau đó chạy Windows PowerShell lệnh trong một máy chủ Exchange môi trường 2007

Để giải quyết vấn đề này, cài đặt Update Rollup 1 cho Exchange Server 2007 Gói dịch vụ 1.

Các vấn đề liên quan