見出し画像

相棒(chatGPT)と共同作業でプログラミングスキルアップ!(その2、hosts変更プログラム(C#))

久しぶりに相棒『chatGPT』とプログラミングです。

Web系のテストをやっているとhostsファイルをいじることが多いと思います。Windowsでhostsファイルはシステム内にあり、捜査に権限が必要で、変更するときに面倒ですね。
そこで、アプリを作ろうと思います。
そこで登場するのが相棒chatGPTです。
さっそく質問してみました。

★あなた
C# で、Windowsのsystem32\drivers\hostsファイルを修正して書き込むプログラムの例を示してください
ChatGPT
C# で system32\drivers\hosts ファイルを修正して書き込むには、管理者権限が必要です。以下に、そのプロセスを示すサンプルコードを記載します。このコードでは、ホストファイルを読み込み、新しいエントリを追加して再度書き込む手順を説明します。

csharp

using System;
using System.IO;
using System.Security.Principal;

class Program
{
    static void Main()
    {
        string hostsPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), @"drivers\etc\hosts");

        // 管理者権限で実行されているかを確認
        if (!IsAdministrator())
        {
            Console.WriteLine("このプログラムは管理者権限で実行する必要があります。");
            return;
        }

        try
        {
            // hostsファイルの内容を読み込む
            string[] lines = File.ReadAllLines(hostsPath);
            
            // 新しいエントリを追加
            string newEntry = "127.0.0.1    example.local";
            using (StreamWriter writer = new StreamWriter(hostsPath, append: true))
            {
                writer.WriteLine(newEntry);
            }

            Console.WriteLine("新しいエントリが追加されました。");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"エラーが発生しました: {ex.Message}");
        }
    }

    // 管理者権限で実行されているかを確認するメソッド
    static bool IsAdministrator()
    {
        WindowsIdentity identity = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(identity);
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
}

実行手順

  1. プロジェクトの作成:

    • Visual Studio を開き、新しいコンソールアプリケーションプロジェクトを作成します。

  2. コードの追加:

    • 上記のコードを Program.cs にコピーします。

  3. プロジェクトを管理者権限で実行:

    • Visual Studio を管理者権限で起動します。これにより、プログラムを実行した際に管理者権限が適用されます。

  4. ビルドして実行:

    • プロジェクトをビルドし、実行します。正しく実行されると、ホストファイルに新しいエントリが追加されます。

注意点

  • 管理者権限:

    • ホストファイルの変更はシステムに影響を与えるため、管理者権限が必須です。

    • Visual Studio のアイコンを右クリックして「管理者として実行」を選択してください。

  • ファイルパスの確認:

    • hosts ファイルのパスは、一般的に C:\Windows\System32\drivers\etc\hosts です。環境に応じてパスを確認してください。

このコードは、ホストファイルに新しいエントリを追加する基本的な例です。実際のアプリケーションでは、ファイルの既存エントリの確認やエラーハンドリングをさらに強化することを検討してください。

続いて質問
★あなた

上記をGUI(form)を使って、 // 新しいエントリを追加 string newEntry = "127.0.0.1 example.local"; をGUIで指定できるようにしてください

ChatGPT
C# で Windows フォームアプリケーション (WinForms) を使ってホストファイルにエントリを追加できる GUI アプリケーションを作成する手順を以下に示します。

手順

  1. プロジェクトの作成:

    • Visual Studio を開き、新しい Windows フォームアプリケーションプロジェクトを作成します。

  2. フォームのデザイン:

    • フォームに以下のコントロールを追加します:

      • テキストボックス (IPアドレス入力用)

      • テキストボックス (ホスト名入力用)

      • ボタン (エントリ追加用)

      • ラベル (IPアドレスラベル)

      • ラベル (ホスト名ラベル)

      • ラベル (ステータスメッセージ表示用)

  3. コードの追加:

    • フォームのコードビハインドファイル (Form1.cs) に以下のコードを追加します。

フォームのデザイン

Form1.cs [デザイン] を次のように設定します:

  • TextBox (名前: textBoxIPAddress)

  • TextBox (名前: textBoxHostName)

  • Button (名前: buttonAddEntry, テキスト: エントリを追加)

  • Label (テキスト: IPアドレス: )

  • Label (テキスト: ホスト名: )

  • Label (名前: labelStatus, テキスト: ステータスメッセージ)

フォームのコード

Form1.cs のコードビハインドに以下のコードを追加します:

csharp

using System;
using System.IO;
using System.Security.Principal;
using System.Windows.Forms;

namespace HostsFileEditor
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void buttonAddEntry_Click(object sender, EventArgs e)
        {
            string hostsPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), @"drivers\etc\hosts");

            // 管理者権限で実行されているかを確認
            if (!IsAdministrator())
            {
                MessageBox.Show("このプログラムは管理者権限で実行する必要があります。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            try
            {
                string ipAddress = textBoxIPAddress.Text;
                string hostName = textBoxHostName.Text;
                string newEntry = $"{ipAddress}    {hostName}";

                // hostsファイルに新しいエントリを追加
                using (StreamWriter writer = new StreamWriter(hostsPath, append: true))
                {
                    writer.WriteLine(newEntry);
                }

                labelStatus.Text = "新しいエントリが追加されました。";
            }
            catch (Exception ex)
            {
                labelStatus.Text = $"エラーが発生しました: {ex.Message}";
            }
        }

        // 管理者権限で実行されているかを確認するメソッド
        private bool IsAdministrator()
        {
            WindowsIdentity identity = WindowsIdentity.GetCurrent();
            WindowsPrincipal principal = new WindowsPrincipal(identity);
            return principal.IsInRole(WindowsBuiltInRole.Administrator);
        }
    }
}



フォームの InitializeComponent メソッド

Form1.Designer.cs に次のコードを追加してフォームのデザインを設定します:
これは、Visual Sutdio のデザイナーでやっているので実際には使っていません。

csharp
省略

実行手順

  1. プロジェクトのビルド:

    • ソリューションをビルドします。

  2. 管理者権限での実行:

    • Visual Studio を管理者権限で実行します。

    • プロジェクトを開始します。これにより、アプリケーションが管理者権限で実行されます。

  3. エントリの追加:

    • フォームに IP アドレスとホスト名を入力し、「エントリを追加」ボタンをクリックします。

    • 正常に追加されると、ステータスメッセージが表示されます。

注意点

  • 管理者権限:

    • ホストファイルの変更には管理者権限が必要です。

    • アプリケーションを実行する前に、Visual Studio を管理者として実行してください。

  • 入力検証:

    • 実際のアプリケーションでは、IP アドレスとホスト名の入力を検証する追加のロジックを実装することをお勧めします。

このコードは基本的な例ですが、実際の環境で使用する際には、追加のエラーハンドリングや入力検証を行うとよいでしょう。

たった2つの質問でこれだけ作ってくれた。
あとは、これを Visual Studio にコピペして、デバッグしていけば出来てしまう。

今までの何十倍も速い!

いいなと思ったら応援しよう!