简体   繁体   中英

Error connect to exchange online using of Office365 a/c whencreated property get-mailbox cmdlet

Error : The WinRM client cannot complete the operation within the time spe cified. Check if the machine name is valid and is reachable over the network and firewall exception for Windows Remote Management service is enabled. Error number: -2144108250

ps1 code:

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# code:

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;
}

I want to connect to exchange and return the recent users from past 7 and 30 days.

I've developed a powershell script that I run to do this. You can also change the WhenCreated attribute to another date attribute if needed. I usually run the commands to remote in separately with these commands

$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

But you could put them in your script if you want. I usually run this script manually. You just need to change the number of days (make sure it stays negative), put in the correct file path and add any other attributes you want to get.

$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
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM