Para este ejercicio se usa estos datos contenidos en la Bd que esta adjunto al proyecto:

Tabla de configuración del Nivel de Acceso:

Teniendo en cuenta la información anterior procedamos a ver el código fuente del ejemplo:
Un de los aspectos mas importantes para poder utilizar el Login esta en el Main de la clase Program que es donde configuraremos que Formulario que deberá de arrancar como inicio, es decir, el formulario que hará la función de Logeo a la Bd.
1: using System;
2: using System.Windows.Forms;
3:
4: namespace RestriccionDeUsuariosCSharp
5: {
6: static class Program
7: {
8: /// <summary>
9: /// Punto de entrada principal para la aplicación.
10: /// </summary>
11: [STAThread]
12: static void Main()
13: {
14: //Application.EnableVisualStyles();
15: //Application.SetCompatibleTextRenderingDefault(false);
16: //Application.Run(new Form1());
17:
18: Application.EnableVisualStyles();
19: Application.SetCompatibleTextRenderingDefault(false);
20:
21: Login frm = new Login();
22: frm.ShowDialog();
23:
24: if (frm.DialogResult == DialogResult.OK)
25: Application.Run(new Form1());
26: }
27: }
28: }
El Formulario Login será el encargado de realizar la autenticación a la Bd:
Dentro procedemos a crear las Funcion autenticar:
1: /// <summary>
2: /// Funcion encargada de validar la existencia del Usuario y Password
3: /// </summary>
4: /// <Autor>Jose Luis Garcia Bautista</Autor>
5: /// <param name="usuario"> Nombre del usuario en la BD</param>
6: /// <param name="password"> Password perteneciente al Nombre de usuario proporcionado</param>
7: /// <returns>True si ambos datos conincide con algun registro de la Bd</returns>
8: public static bool Autenticar(string usuario, string password)
9: {
10: //Utilizamos el Bloque Using...end Using para administrar la conexion
11: //este se encarga de cerrar la conexion y destruir todos los objetos encerrados en el
12: using (SqlCeConnection cnx = new SqlCeConnection(ConfigurationManager.ConnectionStrings["UserConnectionString"].ToString()))
13: {
14: //
15: //Abrimos la conexion a la Bd
16: //
17: cnx.Open();
18: //
19: //Creamos la Consulta SQl utilizando parametros, en donde unicamente recuperaremos el NivelDeAcceso
20: //con el que cuenta el Usuario siempre cuando Exista y se hayan proporcionado las credenciales validas
21: //
22: const string sqlAction = "SELECT NivelAcceso FROM Usuarios WHERE Usuario = @username AND Password = @pass";
23: //
24: //Creamos el objento Command propio del motor de la Bd que estamos usando
25: //
26: SqlCeCommand cmd = new SqlCeCommand(sqlAction, cnx);
27: //
28: //Asignamos valores a la coleccion de parametros
29: //
30: cmd.Parameters.AddWithValue("@username", usuario);
31: cmd.Parameters.AddWithValue("@pass", password);
32: //
33: //Recuperamos la cantidad de registros coincidentes con el Usuario y Password por logica
34: //solo podremos recuperar un solo registro
35: //
36: int tipoUsuario = Convert.ToInt32(cmd.ExecuteScalar());
37: //
38: //Si el tipodeusuario es Mayor a cero significa que la Validacion fue cumplida y el usuario
39: //tiene un nivel de acceso
40: //
41: if (tipoUsuario > 0)
42: {
43: //
44: //Enviamos el Nivel de acceso a la propiedad NivelAcceso de la Clase Usuarios
45: //
46: Usuario.NivelAcceso = tipoUsuario;
47: //
48: //retornamos True ya que la validacion a sido Exitosa
49: //
50: return true;
51: }
52: }
53: //
54: //Si la validacion no fue cumplica retornamos False para evitar continuar con el proceso
55: //
56: return false;
57: }
Utilizamos la función Autenticar:
1: private void btnaceptar_Click(object sender, EventArgs e)
2: {
3: try
4: {
5:
6: //Mandamos a llamar a la funcion Autenticar mandandole los parametros requeridos
7: //Autenticar(ByVal usuario As String, ByVal password As String)
8:
9: {
10: if (Autenticar(txtusuario.Text.Trim(), txtpassword.Text.Trim()))
11: {
12: //Si el resultado de la funcion es True entonces enviamos comor resultado un Ok
13: DialogResult = DialogResult.OK;
14: }
15: else
16: {
17: //Si la funcion autenticar envio un False entonces mostramos el mensaje y mandamos un Abort
18: MessageBox.Show("Usuario o Password no validos");
19: DialogResult = DialogResult.Abort;
20: }
21: }
22: }
23: catch (Exception ex)
24: {
25: MessageBox.Show(string.Format("Error : {0}", ex.Message), "Error inesperado", MessageBoxButtons.OK, MessageBoxIcon.Error);
26: }
27: }
Dentro del Form1 procedemos a validar el Nivel de acceso del usuario para habilitar e inhabilitar las opciones del Menú:
1: using System;
2: using System.Windows.Forms;
3:
4: namespace RestriccionDeUsuariosCSharp
5: {
6: public partial class Form1 : Form
7: {
8: public Form1()
9: {
10: InitializeComponent();
11: }
12:
13: private void Form1_Load(object sender, EventArgs e)
14: {
15: //Preguntamos por el contenido de la variable publica
16: //NivelAcceso contenido en la clase Usuario
17:
18: {
19: switch (Usuario.NivelAcceso)
20: {
21: //
22: //Opciones validar para un Administrador
23: //
24: case 1:
25: //Configuramos las opciones
26: MenuInvitado.Enabled = false;
27: MenuMiembro.Enabled = false;
28: break;
29:
30: //
31: //Opciones validas para un Miembro
32: //
33: case 2:
34: MenuAdmisnitrador.Enabled = false;
35: MenuMiembro.Enabled = false;
36: break;
37:
38: //
39: //Opciones validas para un Invitado
40: //
41: case 3:
42: MenuInvitado.Enabled = false;
43: MenuAdmisnitrador.Enabled = false;
44: break;
45: }
46: }
47: }
48: }
49: }
Si el proceso de Login fue cubierto satisfactoriamente podremos ver el formulario Form1 con las restricciones configuradas:

El ejemplo proporcionado cuenta con muchas opciones de mejora como.
- No utilizar una propiedad publica para compartir del Nivel de acceso de Usuario y en cambio usar el Patron Singleton para compartir información en todo el proyecto sin el riesgo de que este sea cambiado por una instancia diferente, es decir, únicamente se instancia una sola vez y nada mas. Para mas información del Patron Singleton: El Patrón Singleton
- El uso de un Algoritmo de encriptación como Hash para poder encriptar la información de Password dando con esto una mayor seguridad a la aplicación, para mayor informacion: Desmitificando la Encriptación (Parte II)
Nota: El proyecto fue desarrollado en Vs2010 usando una Bd SqlCompact V3.5 y Framework 4.0
Proyecto de ejemplo C#