DOBON.NET DOBON.NETプログラミング掲示板過去ログ

NTPサーバの取得

  • 題名: NTPサーバの取得
  • 著者: yosi
  • 日時: 2012/03/15 11:10:30
  • ID: 30090
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[Windows XP C# VisualStudio2010]
分類:[.NET]

ネットワーク設定の取得をしています。
IPアドレスやサブネットマスクなどは、
WMIで下記のように取得しました。

string query = "SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled=TRUE";
ManagementObjectSearcher mos = new ManagementObjectSearcher(query);
ManagementObjectCollection moc = mos.Get();
foreach (ManagementObject mo in moc)
{
  // IPアドレス取得
  string ipAddress = ((string[])mo.Properties["IPAddress"].Value)[0];
  // サブネットマスク取得
  string ipSubnet = ((string[])mo.Properties["IPSubnet"].Value)[0];
}

そこで質問ですが、
NTPサーバ(URL)を取得することはできるのでしょうか?
WMI以外でも構いません。
NTPサーバの取得方法を教えていただきたいです。

よろしくお願いします。
2012/03/15(Thu) 11:44:45 編集(投稿者)

# 投稿できない URL がある…何故?

■No30090に返信(yosiさんの記事)
> NTPサーバ(URL)を取得することはできるのでしょうか?

NTP サーバーに接続して時刻同期を行いたいという意味であれば、
C# では下記のように書けます。
http://d.hatena.ne.jp/fezg00/20090815/1250336708
http://www.geocities.jp/gwave_soho/tips/category.htm

それとも、コントロールパネルの「日付と時刻」の[インターネット時刻]の
設定を読み取りたいという意味でしょうか。であればレジストリ参照で。
http://www.atmarkit.co.jp/fwin2k/operation/winntp02/winntp02_03.html
2012/03/15(Thu) 11:57:43 編集(投稿者)

■No30092に返信(魔界の仮面弁士さんの記事)
返信ありがとうございます。
> それとも、コントロールパネルの「日付と時刻」の[インターネット時刻]の
> 設定を読み取りたいという意味でしょうか。であればレジストリ参照で。
> http://www.atmarkit.co.jp/fwin2k/operation/winntp02/winntp02_03.html
NTPサーバを取得して、取得したURLをテキストボックスに表示したいです。

string rKeyName = @"SYSTEM\CurrentControlSet\Services\W32Time\Parameters";
string rGetValueName = "NtpServer";
try
{
  Microsoft.Win32.RegistryKey rKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(rKeyName);
  string ntpServer = (string)rKey.GetValue(rGetValueName);
  rKey.Close();
}
catch (NullReferenceException) { }

これで取得できました。

NtpServerには「time.windows.com,0x1」と入っているのですが、
「time.windows.com」までを取得したいのですが、
ntpServer.Substring(0, ntpServer.IndexOf(','));
以外になにか簡単に出来る方法はありますか?

質問の内容が変わってしまいすみません。
2012/03/15(Thu) 13:37:53 編集(投稿者)
2012/03/15(Thu) 12:57:55 編集(投稿者)

■No30093に返信(yosiさんの記事)
> NtpServerには「time.windows.com,0x1」と入っているのですが、
「ntp1.example.com,0x1 ntp2.example.com,0x1」のように複数指定されたり、
「time.example.com,0x2」や「time.example.com,0x9」などとなることも。

なお、OS がこの設定を使うかどうかは "Type" の値によります。
http://www.atmarkit.co.jp/fwin2k/operation/winntp02/winntp02_03.html


> 「time.windows.com」までを取得したいのですが、
> ntpServer.Substring(0, ntpServer.IndexOf(','));
> 以外になにか簡単に出来る方法はありますか?
IndexOf & Substring でも十分に簡単な気がしますが、
それだと何か都合が悪かったのでしょうか?

もちろん、未設定時の対応などは必要ですし、複数の外部NTPサーバーが
指定された場合に対応する必要もあるでしょうけれども。


とりあえず、別の方法という事で:

(案1) Split で空白で分割した後、それぞれを "," でさらに Splitする。
  string ntpServer = "ntp1.example.com,0x1 ntp2.example.com,0x1";
  string[] ntp = ntpServer.Split(' ').Select(s => s.Split(',').First()).ToArray();

(案2) 正規表現で切り出す。
  string ntpServer = "ntp1.example.com,0x1 ntp2.example.com,0x1";
  string[] ntp = Regex.Matches(ntpServer, "[^, ]+(?=,)").OfType<Match>().Select(x => x.Value).ToArray();

# 案1 と案2 では、ntpServer == "" だった場合の動作が異なります。
  • 題名: Re[4]: NTPサーバの取得
  • 著者: yosi
  • 日時: 2012/03/15 13:05:22
  • ID: 30096
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
■No30094に返信(魔界の仮面弁士さんの記事)
返信ありがとうございます。
> 「ntp1.example.com,0x1 ntp2.example.com,0x1」のように複数指定されたり、
> 「time.example.com,0x2」や「time.example.com,0x9」などとなることも。
複数指定されることもあるのですね。
勉強になりました。

> IndexOf & Substring でも十分に簡単な気がしますが、
> それだと何か都合が悪かったのでしょうか?
他に簡単にできる方法があれば知りたいなと思ったのです。
二種類も教えていただきありがとうございます。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板