使用Office365 a / c whencreated属性get-mailbox cmdlet连接到联机时出错

时间:2015-07-02 05:45:01

标签: c# powershell-remoting

  

错误:WinRM客户端无法在指定的时间内完成操作。检查计算机名称是否有效并且是否可通过网络访问,并且启用了Windows远程管理服务的防火墙例外。错误号:-2144108250

ps1代码:

param
(
[Parameter(Mandatory=$true)][System.Management.Automation.PSCredential]$credentials
)

$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $credentials -Authentication Basic –AllowRedirection
Import PSSession $Session
Get-Mailbox

C#代码:

PSCredential credential;
private Runspace runspace;
private string UserName = ConfigurationManager.AppSettings["office365username"];
private string Password = ConfigurationManager.AppSettings["office365password"];

internal PSHelper()
{
    //Create the object of PSCredentials class
    credential = new PSCredential(this.UserName, CreateSecurePassword(this.Password));
    InitialSessionState SessionState = InitialSessionState.CreateDefault();
    SessionState.ImportPSModule(new[] { "MSOnline" });
    InitialSessionState Session = InitialSessionState.CreateDefault();
    SessionState.ImportPSModule(new[] { "PSSession" });
    //Create new runspace
    runspace = RunspaceFactory.CreateRunspace(SessionState);
    runspace.Open();
}

public GetRecentUsersCountResponse GetRecentUserCount()
{
    GetRecentUsersCountResponse Response = new GetRecentUsersCountResponse();
    try
    {

    int CountValue = 0;
    DateTime BeginDateForWeek;
    DateTime EndDateForWeek;
    string script = ReadPowerShellScript("GetRecentUserCount.ps1");
    Command cmd = new Command(script, true);
    cmd.Parameters.Add(new CommandParameter("credentials", credential));
    Pipeline pipeline = runspace.CreatePipeline();
    pipeline.Commands.Add(cmd);
    pipeline.Input.Close();
    Collection<PSObject> collectionPSObject = pipeline.Invoke();
    if (collectionPSObject.Count > 0)
    {
        foreach (PSObject itemUser in collectionPSObject)
        {
            //check if the user if licensed,IsActive,WhenCreated
            if (itemUser.Properties["IsLicensed"] != null && itemUser.Properties["IsActive"] != null && itemUser.Properties["WhenCreated"] != null)
            {
                if (Convert.ToBoolean(itemUser.Properties["IsLicensed"].Value) && Convert.ToBoolean(itemUser.Properties["IsActive"].Value) && itemUser.Properties["WhenCreated"] != null)
                {
                    BeginDateForWeek = DateTime.Now;
                    EndDateForWeek = Convert.ToDateTime(itemUser.Properties["WhenCreated"].Value);
                    TimeSpan DifferenceofWeekDate = BeginDateForWeek - EndDateForWeek;
                    int DiffernceofDays = Convert.ToInt32(DifferenceofWeekDate.Days);
                    //Count only if  recently created users from last 7 days
                    if (DiffernceofDays <= 30)
                    {
                        CountValue++;
                    }

                }

            }
        }
    }
    pipeline.Stop();
    if (pipeline.Error.Count > 0)
    {
        StringBuilder builder = new StringBuilder();

        foreach (object item in pipeline.Error.ReadToEnd())
        {
            builder.Append(item.ToString());
            builder.Append(" - ");
        }
        Response.ErrorMessage = builder.ToString();
    }

    if (CountValue <= 7)
    {
        Response.RecentUserCountWeek = CountValue;
    }

    if (CountValue <= 30)
    {
        Response.RecentUserCountMonth = CountValue;
    }
    }

    catch (Exception ex)
    {
    Response.ErrorMessage = ex.Message;
    }
    finally
    {
    runspace.Dispose();
    }
    //return Response;
    return Response;
}

我想连接到交换并返回过去7天和30天的最近用户。

1 个答案:

答案 0 :(得分:0)

我开发了一个PowerShell脚本,我运行它来执行此操作。如果需要,您还可以将WhenCreated属性更改为其他日期属性。我通常使用这些命令单独运行命令到远程

$cred = Get-Credential
(enter full email address and password)
$Session = New-PSSession -ConfigurationName Microsoft.Exchange 
  -ConnectionUri https://ps.outlook.com/powershell/ 
  -Credential $cred -Authentication Basic -AllowRedirection
Import-PSSession $Session

但如果你愿意,你可以把它们放在你的脚本中。我通常手动运行此脚本。您只需要更改天数(确保它保持为负数),放入正确的文件路径并添加您想要获得的任何其他属性。

$fpath = "c:\users\(currentuser)\desktop\UserCreateDates.csv"
$numdays = -30

$logfilePath = (Test-Path $fpath)
if (($logFilePath) -ne "True")
{
    New-Item $fpath -ItemType File
    Add-Content $fpath "Name,EmailAddress,Created"
}
else
{
    Clear-Content $fpath
    Add-Content $fpath "Name,EmailAddress,Created"
}

$date1 = [DateTime]::Today.AddDays($numdays)
$Mailboxes = Get-Mailbox -ResultSize Unlimited -filter {RecipientType -eq "UserMailbox"} 

ForEach ($Mailbox In $Mailboxes) {
$DisplayName = """" + $Mailbox.DisplayName + """"
$UPN = """" + $Mailbox.UserPrincipalName + """"
$mailboxCreated = $Mailbox.WhenCreated
if ($mailboxCreated -gt $date1)
    {
        $DisplayName + "," + $UPN + ",""" + 
        $mailboxCreated + """" | Out-File -FilePath $fpath -Append
    }
}