Select Page
How to enable Archiving in Microsoft 365 exchange online

How to enable Archiving in Microsoft 365 exchange online

The Exchange admin center (EAC) lets you enable the archive mailbox only individually – for one user at a time. For bulk actions, refer to the section on using Windows PowerShell.
  1. Sign in to the Exchange admin center.
  2. Go to Recipients > Mailboxes to display the list of mailboxes.
  3. Click a user for whom you want to enable the archive mailbox. In the pane that opens, select the Others tab and click Manage mailbox archive

4. Next, set the toggle switch to Enabled and click Save.

4. Next, set the toggle switch to Enabled and click Save.

Note: It usually takes a few moments to create the archive mailbox in the EAC.

Creating Retention Tags

  1. In the Exchange (legacy) – Microsoft Purview go to Information Governance > Retention.
  2. Click the “+” icon to create a new retention tag.
  3. Give the tag a name, choose the type of retention and duration.
  4. Click save.

Applying a Retention Policy

  1. Go to Information Governance > Policies.
  2. Click “+” to create a new retention policy.
  3. Give the policy a name and select the retention tags to apply.
  4. Click save then refresh.
  5. Select the policy and click “Apply to content locations”.
  6. Choose the mailboxes or folders to apply the policy to.

Apply policy to user mailbox

  1. Click Mailbox
  2. Click Manage mailbox policies
  3. Select the Retention policy from the dropdown menu.

Exchange Online Managed Folder Assistant

Exchange Online runs the Managed Folder Assistant (MFA) weekly to process mailboxes per the retention policy schedule. To manually trigger MFA immediately, run this PowerShell command below as administrator.

This will start applying any retention policies right away instead of waiting for the normal cycle.

Powershell script to kick off MFA on exchange online

#Requires -RunAsAdministrator
$nameofuser = ""

# Close and re-open your PowerShell window when done

# Add -Force to it when you need to update EXO V1.
#Install-Module -Name ExchangeOnlineManagement -Force

Start-ManagedFolderAssistant –Identity $nameofuser

# Run a report to show you the status of when MFA was last run
$logProps = Export-MailboxDiagnosticLogs $nameofuser -ExtendedProperties
$xmlprops = [xml]($logProps.MailboxLog)
$xmlprops.Properties.MailboxTable.Property | ? {$_.Name -like "ELC*"}

The screenshot show a successful run of MFA of a user account on Exchange online

Create a local admin with PowerShell

Create a local admin with PowerShell

In this guide, we will how to setup a local administrator in windows 10 using PowerShell.

  1. Open Start on Window 10
  2. Search for Powershell ISE, right-click the top result and select Run as Administrator
  3. Copy and paste the code below into thePowerShell ISE editor and save as createAdmin.ps1

Edit the $Username=”New_Account_name” to the username you want. Edit the $Password to the Password you want it to be.

#Requires -RunAsAdministrator
$Username = "testuser"
$Password = "password123!"
$group = "Administrators"

$adsi = [ADSI]"WinNT://$env:COMPUTERNAME"
$existing = $adsi.Children | Where-Object { $_.SchemaClassName -eq 'user' -and $_.Name -eq $Username }

    Write-host "Calling local admin script"  -ForegroundColor Green

    if ($null -eq $existing) {
        Write-Host "Creating new local user $Username."
        & NET USER $Username $Password /add /y /expires:never
        Write-Host "Adding local user $Username to $group."
        & NET LOCALGROUP $group $Username /add
    else {
        Write-Host "Setting password for existing local user $Username."

    Write-Host "Ensuring password for $Username never expires."

Note: Keeping a password stored in Script would be considered a security risk, Consider replacing the $Password variable with code snippet below

$Password = Read-Host 'What is your password?' -AsSecureString
Datatables with Pagination using Ajax, PHP, MySql calling a php functions

Datatables with Pagination using Ajax, PHP, MySql calling a php functions

This PHP tutorial will help you create jquery Datatable 1.10.16 using a Bootstrap 3.3.7. with pagination. The tutorial is broken into 8 steps.

We will use the following structure for the datatable:

  • index.php
  • configDB.php
  • response.php

Step 1: Create a Bootstrap Html page called index.php and include the scripts and CSS below


<link href="" rel="stylesheet"/>
<link href="" rel="stylesheet"/>

 <script src=""
    <script src=""></script> 
    <script type="text/javascript" src=""></script> 
    <script type="text/javascript" src=""></script>
    <script type="text/javascript" src=""></script>

Step 2: Add the Html below to inside the body tags

<div class="container">
    <div class
    <div class="header"><h1>Server side DataTable demo in Php,Mysql and Ajax </h1></div>
    <div class="container">
        <table id="employee-grid" class="table table-striped table-bordered" style="width:100%">
                <th>Employee name</th>

Step 3: Instantiate the datatable object in index.php

$(document).ready(function () {
          var dataTable = $('#employee-grid').DataTable({
              "responsive": true,
              "processing": true,
              "serverSide": true,
              "ajax": {
                  url: "ajax/response.php", // json datasource
                  data: {action: 'getEMP'}, // Set the POST variable  array and adds action: getEMP
                  type: 'post',  // method  , by default get
              error: function () {  // error handling
                  $("#employee-grid").append('<tbody class="employee-grid-error"><tr><th colspan="3">No data found in the server</th></tr></tbody>');
                  $("#employee-grid_processing").css("display", "none");

Step 4: Create a database connection file called config.php

define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'username');
define('DB_PASSWORD', 'passwordForDB');
define('DB_NAME', 'DatabaseName');
$DBconnect = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
//echo "Connect Successfully. Host info: " . mysqli_get_host_info($DBconnect);
if (!$DBconnect) {
    die("Connection failed: " . mysqli_connect_error());

Step 5: For this example, you will need to load data from the MySQL database, so we need to create a database table to store and retrieve data.

-- Table structure for table `employee`

  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'primary key',
  `employee_name` varchar(255) NOT NULL COMMENT 'employee name',
  `employee_salary` double NOT NULL COMMENT 'employee salary',
  `employee_age` int(11) NOT NULL COMMENT 'employee age',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 COMMENT='datatable demo table' AUTO_INCREMENT=64 ;

-- Dumping data for table `employee`

INSERT INTO `employee` (`id`, `employee_name`, `employee_salary`, `employee_age`) VALUES
(1, 'Tiger Nixon', 320800, 61),
(2, 'Garrett Winters', 170750, 63),
(3, 'Ashton Cox', 86000, 66),
(4, 'Cedric Kelly', 433060, 22),
(5, 'Airi Satou', 162700, 33),
(6, 'Brielle Williamson', 372000, 61),
(7, 'Herrod Chandler', 137500, 59),
(8, 'Rhona Davidson', 327900, 55),
(9, 'Colleen Hurst', 205500, 39),
(10, 'Sonya Frost', 103600, 23),
(11, 'Jena Gaines', 90560, 30),
(12, 'Quinn Flynn', 342000, 22),
(13, 'Charde Marshall', 470600, 36),
(14, 'Haley Kennedy', 313500, 43),
(15, 'Tatyana Fitzpatrick', 385750, 19),
(16, 'Michael Silva', 198500, 66),
(17, 'Paul Byrd', 725000, 64),
(18, 'Gloria Little', 237500, 59),
(19, 'Bradley Greer', 132000, 41),
(20, 'Dai Rios', 217500, 35),
(21, 'Jenette Caldwell', 345000, 30),
(22, 'Yuri Berry', 675000, 40),
(23, 'Caesar Vance', 106450, 21),
(24, 'Doris Wilder', 85600, 23),
(25, 'Angelica Ramos', 1200000, 47),
(26, 'Gavin Joyce', 92575, 42),
(27, 'Jennifer Chang', 357650, 28),
(28, 'Brenden Wagner', 206850, 28),
(29, 'Fiona Green', 850000, 48),
(30, 'Shou Itou', 163000, 20),
(31, 'Michelle House', 95400, 37),
(32, 'Suki Burks', 114500, 53),
(33, 'Prescott Bartlett', 145000, 27),
(34, 'Gavin Cortez', 235500, 22),
(35, 'Martena Mccray', 324050, 46),
(36, 'Unity Butler', 85675, 47),
(37, 'Howard Hatfield', 164500, 51),
(38, 'Hope Fuentes', 109850, 41),
(39, 'Vivian Harrell', 452500, 62),
(40, 'Timothy Mooney', 136200, 37),
(41, 'Jackson Bradshaw', 645750, 65),
(42, 'Olivia Liang', 234500, 64),
(43, 'Bruno Nash', 163500, 38),
(44, 'Sakura Yamamoto', 139575, 37),
(45, 'Thor Walton', 98540, 61),
(46, 'Finn Camacho', 87500, 47),
(47, 'Serge Baldwin', 138575, 64),
(48, 'Zenaida Frank', 125250, 63),
(49, 'Zorita Serrano', 115000, 56),
(50, 'Jennifer Acosta', 75650, 43),
(51, 'Cara Stevens', 145600, 46),
(52, 'Hermione Butler', 356250, 47),
(53, 'Lael Greer', 103500, 21),
(54, 'Jonas Alexander', 86500, 30),
(55, 'Shad Decker', 183000, 51),
(56, 'Michael Bruce', 183000, 29),
(57, 'Donna Snider', 112000, 27);

Step 6: Create the response.php and include the connection at the top of the file

if (isset($_POST['action']) && !empty($_POST['action'])) {
    $action = $_POST['action'];
    switch ($action) {
        case 'getEMP' :
        case 'getProd' :
        // ...etc...

Step 8: Create the function getEMP and pass in the $DBconnect object.

function getEMP($DBconnect)
// storing  request (ie, get/post) global array to a variable
    $requestData = $_REQUEST;
    $columns = array(
// datatable column index  => database column name
        0 => 'employee_name',
        1 => 'employee_salary',
        2 => 'employee_age'
// getting total number records without any search
    $sql = "SELECT employee_name, employee_salary, employee_age ";
    $sql .= " FROM employee";
    $query = mysqli_query($DBconnect, $sql) or die("Mysql Mysql Error in getting : get products");
    $totalData = mysqli_num_rows($query);
    $totalFiltered = $totalData;  // when there is no search parameter then total number rows = total number filtered rows.
    $sql = "SELECT employee_name, employee_salary, employee_age ";
    $sql .= " FROM employee WHERE 1=1";
    if (!empty($requestData['search']['value'])) {   // if there is a search parameter, $requestData['search']['value'] contains search parameter
        $sql .= " AND ( employee_name LIKE '" . $requestData['search']['value'] . "%' ";
        $sql .= " OR employee_salary LIKE '" . $requestData['search']['value'] . "%' ";
        $sql .= " OR employee_age LIKE '" . $requestData['search']['value'] . "%' )";
    $query = mysqli_query($DBconnect, $sql) or die("Mysql Mysql Error in getting : get products");
    $totalFiltered = mysqli_num_rows($query); // when there is a search parameter then we have to modify total number filtered rows as per search result.
    $sql .= " ORDER BY " . $columns[$requestData['order'][0]['column']] . "   " . $requestData['order'][0]['dir'] . "   LIMIT " . $requestData['start'] . " ," . $requestData['length'] . "   ";
    /* $requestData['order'][0]['column'] contains colmun index, $requestData['order'][0]['dir'] contains order such as asc/desc , $requestData['start'] contains start row number ,$requestData['length'] contains limit length. */
    $query = mysqli_query($DBconnect, $sql) or die("Mysql Mysql Error in getting : get products");
    $data = array();
    while ($row = mysqli_fetch_array($query)) {  // preparing an array
        $nestedData = array();
        $nestedData[] = $row["employee_name"];
        $nestedData[] = $row["employee_salary"];
        $nestedData[] = $row["employee_age"];
        $data[] = $nestedData;
    $json_data = array(
        "draw" => intval($requestData['draw']),   // for every request/draw by clientside , they send a number as a parameter, when they recieve a response/data they first check the draw number, so we are sending same number in draw.
        "recordsTotal" => intval($totalData),  // total number of records
        "recordsFiltered" => intval($totalFiltered), // total number of records after searching, if there is no searching then totalFiltered = totalData
        "data" => $data   // total data array
    echo json_encode($json_data);  // send data as json format

Links to the Demo and Source code below.

Basic Weather Widget

Basic Weather Widget

Update: Dark Sky APi was shutdown in August 1st 2020

This is a PHP website that connects to Dark sky API to get current weather conditions and a 5-day weather forecast and display it as a responsive web page. it uses the IP address sent to the web server as a request which is then sent to Ip loc API which sent back the latitude and longitude(20-30 km accuracy) of the Requester.

The libraries and API used in this project were:

Link to Github repo

<?php array(337.5, 22.5),
'NE' => array(22.5, 67.5),
'E' => array(67.5, 112.5),
'SE' => array(112.5, 157.5),
'S' => array(157.5, 202.5),
'SW' => array(202.5, 247.5),
'W' => array(247.5, 292.5),
'NW' => array(292.5, 337.5)
// for statement to convert degree to wind direction eg west
foreach ($cardinalDirections as $dir => $angles) { // convert degrees into wind direction => is separator, key value pair
if ($bearing >= $angles[0] && $bearing < $angles[1]) {
// if bearing greater than/equal and less than ,
// then set direction to = dir
$direction = $dir;
return $direction;
$direction = degreeToString($bearing); // calls the degree to string function
//Daily Forecast
$dailySummary = $resultsDark['daily']['summary'];
$dailyIcon = $resultsDark['daily']['icon'];
$dailyCond = array();
foreach ($resultsDark['daily']['data'] as $d) { // for loop through array to find Key daily and value data,
// set that as a new array dailycond
$dailyCond[] = $d;
foreach ($dailyCond as $cond) {
$wTempHigh = round($cond['temperatureMax']);
$wTempLow = round($cond['temperatureMin']);
$wTime = $cond['time'];
$wIcon = $cond['icon'];


Securing your online account

Securing your online account

Internet usage is most common in every PC be it your personal computer or at the office. Security is the first thing that anyone would be concerned about as internet connectivity has its own pros and cons and hacking is one of the most important concerns for most of the PC users. Now, PC users can be relieved of these concerns as below given are some simple steps which they can easily adapt and get their computers and online accounts secured.

Removal of the pre-installed software and apps:

With the recent Man-in-the-middle attack in the Lenovo computers, the pre-installed apps and software really seem to be very dangerous. Most of the times it is just a bloatware unless the user really has some use of all these apps and software hence getting rid of this definitely safeguards the computer against any security threat. Further, it is better to get rid of any pseudo antiviruses accompanied with the new computer.

Choosing a secured web browser:

This is an important task as most of the malicious malware comes through the web browser. Setting the right web browser is essential because the correct web browser can help the user to safeguard against all the malware and also help the user to use their computer to the best. Depending upon the age of computer and the device that is being used, the user needs to choose the correct web browser. Further, Google Chrome is one of the best web browsers which provides additional security via Sandbox feature. If the user wants to add further features they can use the Mozilla Firefox extensions also. Basically, the user needs to know what they want from their browser then check the features and check if the browser meets their requirement then start using that browser. (more…)