vendredi 23 décembre 2011

Authentification par formulaire ASP.NEt

1. Contexte

Plusieurs jours de galère, cherchant voies et moyens pour sécuriser une application web créée au sein de l'entreprise ont abouti à une solution exploitable. Je me suis proposé de partager cette expérience à travers ces écrits afin que autres personnes ne puissent pas perdre le temps comme moi.    
 
En effet, le mode d'authentification par formulaire consiste à rediriger tout utilisateur vers une page de login tant que celui-ci ne s'est pas authentifié. L'authentification peut-être réalisée soit à partir d'un fichier de configuration XML soit à partir d'un système externe (SGBD ou Active Directory). Dans notre cas , nous avons utilisé  un mode mixte : authentification à travers Active Directory et contrôle du rôle de l’utilisateur dans la base des données.
 

L'authentification par formulaire vous offre un moyen d'authentifier des utilisateurs à l'aide de votre propre code puis de conserver un jeton d'authentification dans un cookie ou dans l'URL de la page. L'authentification par formulaire participe au cycle de vie de la page ASP.NET via le module FormsAuthenticationModule.

Pour utiliser l'authentification par formulaire, vous créez une page de connexion qui collecte les informations d'identification de l'utilisateur et inclut le code servant à authentifier ces informations. Si les informations d'identification sont correctes, vous pouvez appeler des méthodes de la classe FormsAuthentication pour rediriger la demande vers la ressource demandée initialement à l'aide d'un ticket d'authentification approprié (cookie). 

Fichiers sources
Les fichiers sources sont : Login.aspx, Login.aspx.cs, Site.Master.aspx, Site.Master.aspx.cs, Global.asax, web.config

1. Login.aspx


 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Login.aspx.cs" Inherits="MGP2.Login" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title></title>
    <link href="Styles/Style_Authentification.css" rel="stylesheet" type="text/css" /> 
<script src="Scripts/popup.js" type="text/javascript"></script>
</head>
<body>
    <form id="form1" runat="server">
 
    <div runat="server" id="Div_Info" class="info_application" visible="false">
          
    </div>
      <div class="error_message">
         <asp:Label ID="Error_Message_Auth" runat="server" Text=""></asp:Label>
     </div>
    <div class="cadre_principal">
   
        <div class="ligne_authentification">
            <div class="ligne_authentification_gauche"> Identifiant </div>
            <div class="ligne_authentification_droite">  <asp:TextBox ID="UserName" runat="server" CssClass="text_box_auth"></asp:TextBox> </div>
        </div>
        
        
         <div class="ligne_authentification">
            <div class="ligne_authentification_gauche"> Mot de passe </div>
            <div class="ligne_authentification_droite"> <asp:TextBox ID="Password" TextMode="Password" runat="server" CssClass="text_box_auth" ></asp:TextBox> </div>
        </div>
         <div>
         <div style="height:12px; width:240px; float:left"> </div>
          <div style="min-height:12px; width:190px; float:left">
            
            <asp:Button ID="Connect" OnClick="Connexion_System" runat="server" Text="Connexion" CssClass="bouton_connexion" />
 
           </div>
         </div>
      
        <div class="ligne_authentification" style="min-height:15px;">
            <div class="ligne_authentification_gauche"> </div>
            <div class="ligne_authentification_droite" style=" padding-top:8px;">
            <a href="javascript:PopupCentrer('Forgotten_Passwd.aspx',535,180,'menubar=no,scrollbars=no,statusbar=no')" class="forgotten_passwd">
            Mot de passe oublié ? </a>
            </div>
        </div>
         <div class="ligne_authentification_finale">
            <div class="ligne_authentification_gauche_finale"> </div>
            <div class="ligne_authentification_droite_finale" style=" padding-top:13px; ">
            
            <a href="javascript:PopupCentrer('Info.aspx',640,300,'menubar=no,scrollbars=no,statusbar=no')" title="Cliquer ici pour avoir plus d'information sur l'application" class="info">
            Plus d'info sur l'application
            </a>
           
          
            
            </div>
        </div>
    </div> 
    </form>
</body>
</html>




2. Login.aspx.cs

using System;
using System.DirectoryServices;
using System.Collections.Generic;
using System.Linq;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Security;

namespace MGP2
{
    public partial class Login : System.Web.UI.Page
    {
        SqlCommand myCommand;
        SqlDataReader myReader;
        SqlConnection myConnection;

        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Connexion_System(object sender, EventArgs e)
        {
            string Login = UserName.Text;
            string MotDePasse = Password.Text;

            try
            {

                //Verifions si l utilisateur existe dans le domaine

                DirectoryEntry Ldap = new DirectoryEntry("LDAP://OU=xxxx,DC=xx,DC=xxxx,DC=xxxxxx", Login,   
                MotDePasse);
                DirectorySearcher searcher = new DirectorySearcher(Ldap);
                searcher.Filter = "(&(objectClass=user)(sAMAccountName=" + UserName.Text + "))";
                SearchResult result = searcher.FindOne();
                DirectoryEntry DirEntry = result.GetDirectoryEntry();

                //Recuperons les informations relatives a l'utilisateur

                string Prenom = DirEntry.Properties["givenName"].Value.ToString();
                string Nom = DirEntry.Properties["sn"].Value.ToString();
                string Email = DirEntry.Properties["mail"].Value.ToString();

             
                //Verifions role et autres attributions de l'utilisateur dans la base des donnees

                myConnection = (SqlConnection)Session["Connecting"];
                string RqtSelect = string.Format("select * from USERS where EMAIL_USER='{0}'", Email);
                myCommand = new SqlCommand(RqtSelect, myConnection);
                myReader = myCommand.ExecuteReader();

                if (myReader.HasRows)
                {
                    while (myReader.Read())
                    {
                        string Loginame1 = myReader.GetString(1);
                        string Loginame2 = myReader.GetString(2);
                        string Loginmail = myReader.GetString(3);
                        string Phone = myReader.GetString(4);
                        Int32 RoleId = myReader.GetInt32(6);

                       //Mettons en sessions les infos utiles de l'utilisateur

                       Session["Login"] = UserName.Text;
                       Session["NomUtilisateur"] = string.Format("{0}", Nom);
                       Session["PrenomUtilisateur"] = string.Format("{0}", Prenom);
                       Session["EmailUtilisateur"] = Email;
                       Session["RoleUtilisateur"] = RoleId;

                       string Adresse_Electronique = Convert.ToString(Session["EmailUtilisateur"]);
                       FormsAuthentication.RedirectFromLoginPage(Adresse_Electronique, true);
                    }
                }

                myReader.Close();


            }
            catch (Exception ex)
            {
                Error_Message_Auth.Text = ex.Message;
            }
        }
    }
}



 3. Site.Master.aspx:

 <asp:Button ID="Quitter" OnClick="Quitter_Page" runat="server" Text="Logout" Width="113px" />
<br>
              
 <asp:Label ID="WellComeText" runat="server" Text=""></asp:Label>   
              
 4. Site.Master.aspx.cs


using System;
using System.DirectoryServices;
using System.Collections.Generic;
using System.Linq;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Security;
namespace MGP2
{
    public partial class SiteMaster : System.Web.UI.MasterPage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if(!IsPostBack)
            {
            Load_Principal_Data();
            }
        }
        void Load_Principal_Data()
        {
            if (Session["EmailUtilisateur"]!= null)
            {
                WellComeText.Text = "Bienvenue" + Convert.ToString(Session["NomUtilisateur"]) + Convert.ToString(Session["PrenomUtilisateur"]);
            
            }
        
        }
        protected void Quitter_Page(object sender, EventArgs e)
        {
            
            //Session["Login"] = null;
            Session.Abandon();
            FormsAuthentication.SignOut();
            FormsAuthentication.RedirectToLoginPage();
        }
    }
}


5. Global.asax
using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;
using Microsoft.SqlServer.Server;
using System.Text.RegularExpressions;

namespace MGP2
{
    public class Global : System.Web.HttpApplication
    {


        void Application_Start(object sender, EventArgs e)
        {
            // Code qui s'exécute au démarrage de l'application

        }

        void Application_End(object sender, EventArgs e)
        {
            //  Code qui s'exécute à l'arrêt de l'application

        }

        void Application_Error(object sender, EventArgs e)
        {
            // Code qui s'exécute lorsqu'une erreur non gérée se produit

        }

       
        void Session_Start(object sender, EventArgs e)
        {
            // Code qui s'exécute lorsqu'une nouvelle session démarre
            SqlConnection myConnection = new SqlConnection();
            //myConnection.ConnectionString = "Data Source=CDLPPOVERTY10;Initial Catalog=MR;Integrated Security=True";
            myConnection.ConnectionString = "Data Source=xxxxx;Initial Catalog=DataBaseName;User ID=xxxx;Password=xxxxxx";

            myConnection.Open();
            Session["Connecting"] = myConnection;
        }

        void Session_End(object sender, EventArgs e)
        {
            // Code qui s'exécute lorsqu'une session se termine.
            // Remarque : l'événement Session_End est déclenché uniquement lorsque le mode sessionstate
            // a la valeur InProc dans le fichier Web.config. Si le mode de session a la valeur StateServer
            // ou SQLServer, l'événement n'est pas déclenché.
            SqlConnection FermerConnexion = (SqlConnection)Session["Connecting"];
            FermerConnexion.Close();
        }

       

    }
}
 
6. web.config


<add name="MRConnectionString" connectionString="Data Source=xxxxx;Initial Catalog=xxx;User ID=xxxxxx;Password=xxxxx" providerName="System.Data.SqlClient" />

Dans le web.config je place seulement la ligne utilie

Ca marche !!!!

Si vous avez des difficultes a exploite ce code :
1. GIF (Google Is your Friend)
2. monsar04[at]gmail.com / 00243997647154

mercredi 30 novembre 2011

M-Pesa, le transfert d'argent via mobile



Au Kenya, il y a des innovations !!! Le service à valeur ajoutée M-PESA ( PESA en Swahili veux dire : l'argent, le M pour signifier Mobile, en somme M-PESA : l'argent mobile

Développé par l'opérateur kényan Safaricom ( http://www.safaricom.co.ke ), M-Pesa est un service de transfert d'argent par téléphone mobile. M-Pesa permet de déposer de l'argent sur son propre compte, d'en envoyer à un contact ou de retirer de l'argent dans un certains nombre de distributeurs ou d'agences bancaires du pays. M-Pesa est un service proposé aux abonnés (cartes prépayées et forfaits) de Safaricom. Les transferts d'argent étant gérés directement par M-Pesa sur des comptes dédiés, il n'est pas nécessaire pour l'utilisateur de disposer d'un compte bancaire. Fourni gratuitement, M-Pesa prélève une commission sur chaque transfert effectué par son biais.

Le mobile s’apprête-t-il à révolutionner le transfert transfrontalier d’argent ?

Chez Western Union, le leader du marché des transferts de fonds, il ne faut pas aller trop vite en besogne. Même si la firme américaine conduit aux Etats-Unis un projet pilote similaire à M-Pesa. Il a démarré en mai 2006 et devrait s’achever en juillet de cette année. « Ce système, présente un véritable potentiel que nous étudions avec nos différents partenaires », constate Matt Dill, vice-président de la Global mobility chez Western Union. Mais pour ce qui est du transfert transfrontalier via un mobile, « l’industrie a besoin qu’une masse critique soit atteinte à l’échelle de la planète. » Un niveau auquel opère la GSM Association, qui rassemble plus de 700 opérateurs de téléphonie mobile dans le monde. Elle lancera prochainement un service pilote similaire à l’initiative kényane avec l’opérateur financier Mastercard. « Nous essayons de mettre en place une plate-forme mondiale, en s’appuyant sur le réseau actuel de Mastercard, qui permettra des transferts transfrontaliers. Plusieurs schémas s’offriront alors aux opérateurs dans chaque pays », explique David Pringle, le porte-parole de l’association. Les Indiens et les Philippins seront les premiers à bénéficier de ce service. Tout comme les Kenyans avec Vodafone.

Quelques Videos demo de M-PESA

http://www.youtube.com/watch?v=M9HGzwSfWZk&feature=related
http://www.youtube.com/watch?v=zQo4VoLyHe0

mardi 15 novembre 2011

Vers la plate forme de developpement de Microsoft

J'ai toujours été convaincu que Microsoft ne pouvais rien offrir de spécial au Monde Informatique car je le trouvais trop égoïste . Je ne jurais que sur Linux, libre efficace, et tant d'autres avantages...

Voici 4 mois que je suis sur la plate forme Microsoft "Etonant !!!!!!!!!" , eh bien il existe de belles choses que j'ignorai : ASP.NET/C#.

Pas à pas  découvrons les secrets de C#


Une méthode regroupe un ensemble d’instructions, pouvant prendre des paramètres et pouvant renvoyer une ou plusieurs valeurs. Parfois la méthode est appelée aussi fonction.
Le but de la méthode est de factoriser du code afin d’éviter d’avoir à répéter sans arrêt le même code et ceci pour deux raisons essentielles : 

- L’homme est un être paresseux qui utilise son intelligence pour éviter le travail inutile ou répétitif. 
- Si jamais il y a quelque chose à corriger dans ce bout de code et s’il est dupliqué à plusieurs endroits, alors il faudrait faire une correction dans tous ces endroits. Si le code est factorisé à un unique endroit, nous ferons une unique correction. ( encore la paresse mais aussi cela permet d’éviter d’oublier un bout de code dans un endroit caché).

Exemple :
(je termine un bel exemple ce samedi a plus )





vendredi 8 juillet 2011

Créer des feuilles de style dynamiques avec LESS


Le CSS est un langage déclaratif simple : la plupart du temps, on applique une valeur à une propriété. Mais de nos jours, avec le développement des attributs propriétaires, le code se trouve dupliqué en de nombreux endroits.
Des gens intelligents se sont donc penchés sur la question, et en ont retiré l’observation suivante : « Nous devrions faire un langage dynamique capable de générer des feuilles de style que les navigateurs pourront comprendre. » Ainsi naquit LESS.

LESS étend CSS grâce à un comportement dynamique, utilisant des variables, des classes abstraites, des opérations et des fonctions. LESS tourne aussi bien côté client (IE version 6 et +, Webkit [Ndt : Safari, Chrome, Midori], Firefox) que côté serveur, avec Node.js

Pour lire plus  à propos de LESS , cliquer ici

lundi 25 avril 2011

La commande find ou la puissance de la recherche

find est une commande UNIX permettant de chercher des fichiers dans un ou plusieurs répertoires selon des critères définis par l'utilisateur. Par défaut, find retourne tous les fichiers contenus dans l'arborescence du répertoire courant. find permet aussi d'exécuter une action sur  chaque fichier retrouvé, ce qui en fait un outil très puissant. La commande find fait partie des commandes avancées les plus efficaces dans l’administration d’un système elle nécessite les privilèges de l’administrateur pour effectuer une recherche sur un ou plusieurs systèmes de fichiers. La commande find est un outil extrêmement puissant, doté d’une cinquantaine d’options, autorisant des recherches définies selon des critères très fins : sur fichiers, répertoires, liens symboliques... à partir du nom (en tenant compte de la casse ou non), selon le propriétaire, la taille, la date, etc, dans un unique système de fichiers ou plus ! Il faut ajouter que ses options se définissent selon deux catégories : sélection et exécution. On mesure alors toute l’étendue de la puissance de cette commande.

La preuve par l’exemple

find dispose de nombreuses options pour limiter les fichiers selon leurs caractéristiques : taille, date de modification, propriétaire, type, etc.

La syntaxe générale est :

find chemin [chemin2...] [options] [action]

Voici quelques exemples d'utilisation :

Impression de la liste des fichiers sous /home qui ont été modifiés dans les 7 derniers jours :

find /home -type f -a -mtime -7 -print

Recherche de la chaîne Wikipedia dans tous les fichiers terminés par .txt sous /home :

find /home -type f -a -name '*.txt' -exec grep -H Wikipedia {} \;
Suppression des fichiers sous /tmp de plus de 14 jours ou nommés core  :

find /tmp -type f -a \( -mtime +14 -o -name 'core' \) -exec rm {} \;

Recherche du fichier nom.txt récursivement à partir du répertoire courant et écrit le résultat dans le fichier sortie.txt situé sur le répertoire spécifié par chemin :

find . -name "nom.txt" -print > ./chemin/sortie.txt

En raison de la possibilité d'espaces dans les noms de fichiers (par exemple /tmp/ /etc/passwd), on prendra garde à des constructions telles que :
find /tmp -type f -a -mtime +14 | xargs rm

 

 




jeudi 21 avril 2011

Sauvegarde des bases des données mysql sous debian


Ce script récupère toutes les bases de données MySQL du serveur MySQL, puis compresse les données en ”.tar.gz”. Une fois les données compressées, elles sont envoyées par mail sur un compte mon compte monsar.database@gmail.com


Mutt est un excellent client de messagerie en ligne de commande et gère parfaitement l'envoi de pièce jointe.
Après avoir installé et configuré postfix, n'oubliez pas d'installer mutt; c'est un véritable clientb de messagerie en mode text

apt-get install mutt

En principe, il faut écrire le corps du mail dans un fichier :

nano /root/message_mail.txt

Bonjour,

En attache à ce mail, veullez trouvez la sauvagarde complete des bases des données du serveur Merci  

Script de sauvegarde

Fonctionnement

toutes les bases de données hébergées sur le serveur seront sauvegardées 
dans ”/root/save_mysql” compressées en ”.tar.gz” envoyées par mail
 
nano /root/script_save_mysql.sh 

#!/bin/sh
## Date -1 jour ##
DATE=$(date +%d-%m-%Y_%Hh-%M –date '1 day ago')
FILE=mysql_dump-${DATE}
## Utilisation de mysqldump attention ici l'option -p et votre mot de passe sont collés ##
mysqldump –all-databases -u root -pvotre_mot_de_passe > /root/save_mysql/$FILE.sql
## COMPRESSION ##
tar cvfz /root/save_mysql/$FILE.tar.gz /root/save_mysql/$FILE.sql
## Suppression du fichier .sql ##
rm /root/save_mysql/$FILE.sql
## Envoi par mail avec le fichier compressé en piece jointe ##
/usr/bin/mutt -a ”/root/save_mysql/$FILE.tar.gz” -s “Sauvegarde MySQL $DATE” -i /root/message_mail.txt email@domaine.com < /dev/null
exit 0
  
Il faut rendre le script exécutable

chmod +x /root/script_save_mysql.sh
Le script sera lancé à 1h du matin, donc on retranche 1 journée dans la date qui s'affiche pour que la sauvegarde soit la date du jour. 

Mettons le script dans le cron pour automatiser l'action

Le script script_save_mysql.sh sera exécuté toutes les nuits à 02h00.
crontab -e
00 02 * * * /root/script_save_mysql.sh > /dev/null
/etc/init.d/cron reload
Et le tour est joué.
Vous allez observer vos mails le jour suivants pour vérifier si vous avez réussi la sauvagarde ou bien changer l'heure du cron pour voir dans quelques minutes 

Que faire si ça ne marche pas ?

1. Vérifier les logs de postfix
2. Vérifier si si mutt est correctement installé
3. GIYF ( Google Is Your Friend)
4. vous avez mon numéro de téléphone (00243997647154)

vendredi 15 avril 2011

Crontab

Crontab est le nom du programme sous Unix (ou Linux) qui permet d'éditer des tables de configuration du programme cron.
Par extension, on appelle souvent cron (ou cron job en anglais) toute application lancée à horaire fixe.
La commande crontab édite en fait un fichier relatif à l'utilisateur qui l'exécute, et en vérifie la syntaxe
Afin d'afficher le contenu de la table cron (pour l'utilisateur courant), il suffit d'exécuter la commande suivante :

$ crontab -l


Modification


Afin d'éditer la table cron (pour l'utilisateur courant), il suffit d'exécuter la commande suivante :

$ crontab -e

Cette commande a pour effet de lancer l'éditeur par défaut

présentant la table actuelle (donc aucune s'il s'agit du premier lancement de crontab). Cette commande ne permet pas de modifier la crontab centralisée (/etc/crontab). Ne pas oublier d'exporter l'éditeur : pour vi lancer la commande suivante :

$ export EDITOR=vi

Chaque entrée de la table (chaque ligne) correspond à une tâche à exécuter et est notée de la façon suivante :

mm hh jj MMM JJJ tâche > log

Dans cette syntaxe :

    * mm représente les minutes (de 0 à 59)
    * hh représente l'heure (de 0 à 23)
    * jj représente le numéro du jour du mois (de 1 à 31)
    * MMM représente le numéro du mois (de 1 à 12) ou l'abréviation du nom du mois (jan, feb, mar, apr, ...)
    * JJJ représente l'abréviation du nom du jour ou le chiffre correspondant au jour de la semaine (0 représente le dimanche, 1 représente le lundi, ..., 7 représente le dimanche)
    * tâche représente la commande ou le script shell à exécuter
    * log représente le nom d'un fichier dans lequel stocker le journal des opérations. Si la clause > log n'est pas spécifiée, cron enverra automatiquement un courriel de confirmation. Pour éviter cela, il suffit de spécifier > /dev/null.

Pour chaque unité de temps (minute/heure/...) les notations sont possibles:

    * * : à chaque unité de temps (0, 1, 2, 3, 4...)
    * 5,8 : les unités de temps 5 et 8
    * 2-5 : les unités de temps de 2 à 5 (2, 3, 4, 5)
    * */3 : toutes les 3 unités de temps (0, 3, 6, 9...)
    * 10-20/3 : toutes les 3 unités de temps, entre la dixième et la vingtième (10, 13, 16, 19)
Imaginons que l'on veuille faire un journal (dans le fichier /tmp/log_df.txt par exemple) automatisé de l'espace disque libre (commande df) à des intervalles de temps précis :

  • Tous les jours à 23h30 :
 30 23 * * * df >>/tmp/log_df.txt
  • Toutes les heures, passées de 5 minutes :
 5 * * * * df >>/tmp/log_df.txt
  • Tous les premiers du mois à 23h30 :
 30 23 1 * * df >>/tmp/log_df.txt
  • Tous les lundis à 22h28 :
 28 22 * * 1 df >>/tmp/log_df.txt
  • Du 2 au 5 de chaque mois à 10h12 :
 12 10 2-5 * * df >>/tmp/log_df.txt
  • Tous les jours pairs du mois à 23h59 :
 59 23 */2 * * df >>/tmp/log_df.txt
  • Tous les jours à 22h que les jours ouvrés :
 0 22 * * 1-5 df >>/tmp/log_df.txt
  • Toutes les 5 minutes :
 */5 * * * * df >>/tmp/log_df.txt
  • Tous les derniers jours du mois (l'antislash devant % est obligatoire en édition de crontab, contrairement à l'exécution de la commande manuellement) :
 0 0 28-31 * * [ `/bin/date +\%d` -gt `/bin/date +\%d -d "1 day"` ] && df >>/tmp/log_df.txt
  • Tous les derniers dimanches du mois :
  • Première solution : comparer tous les dimanches avec celui de la semaine d'après.
 0 0 * * 0 [ `/bin/date +\%d` -gt `/bin/date +\%d -d "7 day"` ] && df >>/tmp/log_df.txt
  • Deuxième solution : tester la dernière semaine tous les mois.
 0 0 25-31 1,3,5,7,8,10,12 0 my-script.sh
 0 0 24-30 4,6,9,11 0 my-script.sh
 0 0 22-29 2 0 my-script.sh
  • Troisième solution : lancer un script avec le calendrier.
 0 0 21-31 * * /bin/script.sh
Autre exemple, le script shell suivant (que l'on supposera stocké dans /home/backup sous le nom backup.cmd) exporte les enregistrements de MySQL (de la table ccmusers par exemple) dans un fichier dont le nom est ccmusers suivi de la date sous la forme jour-mois-annee-heure-minute:

 #!/bin/sh
 DATE=$(date +%d-%m-%Y-%H-%M)
 /usr/local/mysql/bin/mysqldump -u root ccmusers > /home/backup/ccmusers${DATE}.sql

Ainsi pour automatiser (chaque jour à 23h59) le backup de la table ccmusers de MySQL et l'appel d'une page web (chaque jour à 21h30), il suffira d'ajouter l'entrée suivante dans la table cron:

 59 23 * * * /home/backup/backup.cmd >>/dev/null
 30 21 * * * wget -O /dev/null http://example.com/mapage.html >>/dev/null