Membuat Wi-Fi Profiles sendiri

Posted by Kamarudin • 4 minute read • Comments

Ada hal rutin yang saya lakukan setiap pagi dan sore, ketika ngantor saya harus mengeset ip statis menyesuaikan ip kantor sedangkan ketika di kos saya harus mengeset ip menjadi dinamis.

Masalah sepele memang tapi lumayan memakan waktu dan membosankan dan saya belum tau (setidaknya untuk saat ini) apakah OS (win 7) yang sy pake menyediakan solusi untuk masalah ini.

Dari teman kantor saya sudah dapat file batch untuk masalah ini, skripnya lebih kurang seperti berikut :

@ECHO OFF
Set varan=Wireless Network Connection
Set varip=172.xx.xx.xx
Set varnm=255.255.0.0
Set vargw=172.xx.xx.xxx
Set vardns1=202.xx.x.x
Set vardns2=202.xx.x.x

ECHO Auto Setting IP (arif.laksito@gmail.com)
ECHO for: "%varan%"
ECHO ---------------------------------------------

ECHO Setting "IP Address", "Subnet Mask" and "Gateway"
netsh interface ipv4 set address name="%varan%" source=static address=%varip% mask=%varnm% gateway=%vargw%

ECHO Setting "Primary DNS"
netsh interface ipv4 add dnsserver name="%varan%" address=%vardns1% index=1

ECHO Setting "Secondary DNS"
netsh interface ipv4 add dnsserver name="%varan%" address=%vardns2% index=2

Sedangkan untuk mengeset ke ip dinamis skripnya lebih sederhana lagi

@ECHO OFF
Set varan=Wireless Network Connection
ECHO Auto Setting IP to DHCP (arif.laksito@gmail.com)
ECHO ---------------------------------------------

ECHO Setting "IP Address", "Subnet Mask" and "Gateway" to DHCP
netsh interface ipv4 set address name="%varan%" source=dhcp

ECHO Setting "DNS" to DHCP
Netsh interface ipv4 set dnsserver "%varan%" dhcp

Kedua skrip diatas sebenarnya sudah menyelesaikan permasalahan, tapi… ada yang kurang sebagai seorang proGAMMER et… sory maksudnya programmer :grin: tentunya kita akan sedikit penasaran bagaimana mengeksekusi skrip diatas via program.

Untuk VB 6 sudah saya bahas tuntas dibeberapa postingan saya, tapi untuk kali ini kita menggunakan bahasa C#, yuph inilah bahasa yang sedang sy gandrungi saat ini :), semua project sy terutama yang baru, saya paksain menggunakan bahasa ini, karena pelan2x tapi pasti VB 6 akan segera ditingalkan :cry:

Yuph intronya kita cukupkan sampai disini, untuk desain GUI aplikasinya seperti berikut :

Beberapa method penting yang digunakan oleh aplikasi ini sebagai berikut :

1. Mendapatkan daftar Network Connection

Untuk mendapatkan daftar network saya menggunakan perintah

netsh int ip show config

Untuk menjalankan perintah diatas saya menggunakan method ExecuteCommand, kemampuan lain dari method ini adalah menampung output dari perintah yang dijalankan.

Untuk contoh disini outputnya saya tampung ke dalam variabel output.

private void ExecuteCommand(string cmd, string parameter, int timeout, bool redirectStandardOutput)
{
    Process p = new Process();

    p.StartInfo.FileName = cmd;
    p.StartInfo.Arguments = parameter;
    p.StartInfo.UseShellExecute = false;
    p.StartInfo.CreateNoWindow = true;
    p.StartInfo.RedirectStandardOutput = redirectStandardOutput;

    try
    {
        p.Start();

        if (redirectStandardOutput)
        {
            p.BeginOutputReadLine();
            p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
        }

        p.WaitForExit(timeout);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "Warning", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
    }
    finally
    {
        p.Close();
    }
}

Untuk selanjutnya variabel output saya olah di method GetNetworkConnections

private string[] GetNetworkConnections()
{
    string[] arrNetwork = null;

    if (output.Count > 0)
    {
        arrNetwork = new string[output.Count];
        int index = 0;
        foreach (string var in output)
        {
            string[] networkConnection = var.Split('\"');
            arrNetwork[index] = networkConnection[1];

            index++;
        }
    }

    return arrNetwork;
}

2. Akses registry

Untuk meningkatkan kemampuan program ini saya juga menambahkan method untuk menulis dan membaca registry, sehingga perubahan terakhir bisa tersimpan dan diload kembali pada saat program dijalankan.

// method untuk membaca registry
private string GetValue(string key, string value)
{
    return Registry.CurrentUser.OpenSubKey(key).GetValue(value).ToString();
}

// method untuk menulis registry
private void WriteValue(string key, string valueName, string value)
{
    Registry.CurrentUser.CreateSubKey(key).SetValue(valueName, value);
}

// method untuk membaca setting program terakhir
private void GetSetting()
{
    output.Clear();
    ExecuteCommand("netsh", "int ip show config", timeout, true);
    cmbNetworkConnection.Items.AddRange(GetNetworkConnections());

    string defaultNetwork = string.Empty;

    RegistryKey registryKey = Registry.CurrentUser.OpenSubKey(key);
    if (registryKey != null)
    {
        defaultNetwork = GetValue(key, "DefaultNetwork");
        txtIPAddress.Text = GetValue(key, "IPAddress");
        txtSubnetMask.Text = GetValue(key, "SubnetMask");
        txtDefaultGateway.Text = GetValue(key, "DefaultGateway");
        txtDnsServer1.Text = GetValue(key, "DnsServer1");
        txtDnsServer2.Text = GetValue(key, "DnsServer2");

        switch (GetValue(key, "IPAktif"))
        {
            case "1": // dinamis
                rdoIPDinamis.Checked = true;
                break;

            case "2": // statis
                rdoIPStatis.Checked = true;
                break;

            default:
                rdoIPDinamis.Checked = true;
                break;
        }

        groupBox1.Enabled = rdoIPStatis.Checked;
    }
    else
    {
        // do nothing
    }

    if (defaultNetwork.Length > 0)
    {
        if (cmbNetworkConnection.Items.Count > 0) cmbNetworkConnection.Text = defaultNetwork;
    }
    else
    {
        if (cmbNetworkConnection.Items.Count > 0) cmbNetworkConnection.SelectedIndex = 0;
    }
}

Sebagai penutup berikut adalah kode pada saat menekan tombol Ok.

private void btnOk_Click(object sender, EventArgs e)
{
    string parameter = string.Empty;

    if (MessageBox.Show("Apakah proses ingin dilanjutkan ?", "Konfirmasi", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes)
    {
        Cursor.Current = Cursors.WaitCursor;
        btnOk.Enabled = false;

        if (rdoIPDinamis.Checked) // ip dinamis
        {
            parameter = "interface ipv4 set address name=\"" + cmbNetworkConnection.Text + "\" source=dhcp";
            ExecuteCommand("netsh", parameter, timeout, false);

            parameter = "interface ipv4 set dnsserver \"" + cmbNetworkConnection.Text + "\" dhcp";
            ExecuteCommand("netsh", parameter, timeout, false);
        }
        else // ip statis
        {
            parameter = "interface ipv4 set address name=\"" + cmbNetworkConnection.Text + "\" source=static address=" + txtIPAddress.Text + " mask=" + txtSubnetMask.Text + " gateway=" + txtDefaultGateway.Text;
            ExecuteCommand("netsh", parameter, timeout, false);

            parameter = "interface ipv4 add dnsserver name=\"" + cmbNetworkConnection.Text + "\" address=" + txtDnsServer1.Text + " index=1";
            ExecuteCommand("netsh", parameter, timeout, false);

            parameter = "interface ipv4 add dnsserver name=\"" + cmbNetworkConnection.Text + "\" address=" + txtDnsServer2.Text + " index=2";
            ExecuteCommand("netsh", parameter, timeout, false);

            WriteValue(key, "IPAddress", txtIPAddress.Text);
            WriteValue(key, "SubnetMask", txtSubnetMask.Text);
            WriteValue(key, "DefaultGateway", txtDefaultGateway.Text);
            WriteValue(key, "DnsServer1", txtDnsServer1.Text);
            WriteValue(key, "DnsServer2", txtDnsServer2.Text);
        }

        WriteValue(key, "DefaultNetwork", cmbNetworkConnection.Text);
        WriteValue(key, "IPAktif", rdoIPDinamis.Checked ? "1" : "2");
        btnOk.Enabled = true;

        Cursor.Current = Cursors.Default;
    }
}

Selamat MENCOBA :blush:

Comments