使用PowerShell在创建New-Mailbox期间设置Active Directory帐户属性

时间:2014-04-29 14:37:28

标签: c# powershell active-directory exchange-server exchange-management-shell

我正在使用Exchange 2010。我目前正在 c#中使用 PowerShell cmdlet New-Mailbox创建一个新的邮箱帐户。

可以动态创建新邮箱(c#)吗?这是我正在使用的代码:

// Prepare the credentials that will be used when connecting
// to the server. More info on the user to use on the notes
// below this code snippet.
string runasUsername = @"xxxxx";
string runasPassword = "xxxxx";
SecureString ssRunasPassword = new SecureString();
foreach (char x in runasPassword)
    ssRunasPassword.AppendChar(x);
PSCredential credentials =
    new PSCredential(runasUsername, ssRunasPassword);

// Prepare the connection
var connInfo = new WSManConnectionInfo(
    new Uri("http://yourip/PowerShell"),
    "http://schemas.microsoft.com/powershell/Microsoft.Exchange",
    credentials);
connInfo.AuthenticationMechanism =
    AuthenticationMechanism.Basic;

// Create the runspace where the command will be executed
var runspace = RunspaceFactory.CreateRunspace(connInfo);

// generate the command parameters
var testNumber = 18;
var firstName = "Test";
var lastName = "User" + testNumber;
var username = "tuser" + testNumber;
var domainName = "dom.dom.ca";
var password = "qwerty123";
var ssPassword = new SecureString();
foreach (char c in password)
    ssPassword.AppendChar(c);

// create the PowerShell command
var command = new Command("New-Mailbox");
command.Parameters.Add("Name", firstName + " " + lastName);
command.Parameters.Add("Alias", username);
command.Parameters.Add(
    "UserPrincipalName", username + "@" + domainName);
command.Parameters.Add("SamAccountName", username);
command.Parameters.Add("FirstName", firstName);
command.Parameters.Add("LastName", lastName);
command.Parameters.Add("Password", ssPassword);
command.Parameters.Add("ResetPasswordOnNextLogon", false);
command.Parameters.Add("OrganizationalUnit", "NeumontStudents");

// Add the command to the runspace's pipeline
runspace.Open();
var pipeline = runspace.CreatePipeline();
pipeline.Commands.Add(command);

// Execute the command
var results = pipeline.Invoke();

runspace.Dispose();

if (results.Count > 0)
    MessageBox.Show("SUCCESS");
else
    MessageBox.Show("FAIL");

(Source) Here's the complete tutorial

我的目标是在邮箱创建过程中设置帐户属性:

  1. 地址(街道,城市等)
  2. 电话号码
  3. 描述
  4. 传真
  5. 但看起来命令cmdlet New-Mailbox缺少所有这些参数。 New-Mailbox documentation

    是否可以在创建邮箱期间设置这些参数?

1 个答案:

答案 0 :(得分:1)

我不知道C#,但是我可以告诉你如何从Exchange命令行管理程序执行此操作,并让它从C#中调用命令,看起来你没有问题。

最简单的方法是使用Exchange命令行管理程序的设置用户 cmdlet:

Set-User -Identity barack.obama -StreetAddress '1600 Pennsylvania Ave NW' -City 'Washington' -StateOrProvince 'D.C.' -PostalCode '20500' -Phone '202-456-1111' -Fax '202-456-2461'

-Identity 可以是您可以与 Get-Mailbox 一起使用的任何身份参数,包括SamAccountName,UserPrincipalName,SmtpAddress,Identity,Alias,一些otehrs。您还可以将邮箱对象通过管道传输到设置用户,并省略 -Identity 。实际上,您可以将 New-Mailbox cmdlet直接发送到 Set-User ,因为它会返回它创建的邮箱对象:

New-Mailbox [...] | Set-User -StreetAddress [...]

参数名称不一定与AD属性名称匹配。例如, -Phone 映射到 officePhone AD属性;还有一个 -HomePhone 参数,该参数映射到 homePhone 属性。

但是, Set-User 仅限于Active Directory属性的某个子集。它将执行您想要的大部分操作,但 description 不会通过此cmdlet公开。你的" Etc"中可能还有其他一些属性。没有暴露的。要设置其他属性,您需要使用其他一些更新Active Directory的方法。

但是,将其集成到EMS脚本中并不困难。您始终可以在Exchange Server上使用AD管理工具,因此您可以使用 dsmod ,它可以更新不同的属性子集,包括说明:

dsmod user (Get-Mailbox barack.obama).DistinguishedName -desc 'Description'

对象类型(用户)之后的第一个参数是专有名称,您可以使用(Get-Mailbox barack.obama).DistinguishedName从邮箱中读取该名称。

同样,参数名称与AD属性不匹配,但您可以通过键入dsmod user /?来获取完整列表。 直接从 New-Mailbox

进行管道传输
New-Mailbox [...] | select -ExpandProperty DistinguishedName | %{dsmod user $_ -desc 'Description'}

其他选择:

  • PowerShell的ADSI提供商。有点笨拙,因为你不能用一个命令设置多个属性,你必须在最后提交更改,但它确实允许你修改任何可设置的属性。这是一个例子:

    $user = [adsi]("LDAP://" + (Get-User barack.obama).DistinguishedName)
    $user.telephoneNumber = '202-456-1111'
    $user.streetAddress = '1600 Pennsylvania Avenue NW'
      [etc...]
    $user.SetInfo()
    
  • Set-ADUser cmdlet。这个可以修改你想要设置的任何属性,并且可以在一个命令中设置多个属性,并且可能是最容易使用的,但当然有一个问题:你需要导入ActiveDirectory模块,在Exchange 2010服务器上无法立即使用。