/// <summary> /// タイマー実行される関数 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { LoadRegistry(); lock (LockObject) { if (DateTime.Now > NextExecutionDateTime) { bool fnetworkCapability = true; try { // ホスト名取得 HostName = Dns.GetHostName(); // IP取得 IpAddress = GetIpFromHost(HostName); // Hostsのフォーマットに変換 HostsLine = IpAddress + " " + HostName; } catch (Exception) { fnetworkCapability = false; eventLog.WriteEntry("Cannot get the Hostname and IP.", EventLogEntryType.Error); } if (fnetworkCapability) { foreach (string strExternalHostsSaveTarget in externalHostsSaveTargetCollection) { string externalHostsStrings = string.Empty; // 外部Hostsがネットワーク上か調べる string externalHostsSaveTargetFolderPath = Path.GetDirectoryName(strExternalHostsSaveTarget); NetworkUtility networkUtility = new NetworkUtility(externalHostsSaveTargetFolderPath); // 外部Hostsがネットワーク上だった場合 if (networkUtility.CheckNetworkPath()) { eventLog.WriteEntry(externalHostsSaveTargetFolderPath + " is network path.", EventLogEntryType.Information); // ユーザーを偽装する using (NativeMethods.GetImpersonationContext("NetworkService", "NT AUTHORITY", "")) { bool isSuccessNetworkConnect; // ユーザー情報に応じて接続を試みる if (IsNetworkAuthentication) { // ユーザー名を"\"で分割 IEnumerable <string> UsernameCollection = NetworkAuthenticationUsername.Split(new char[] { '\\' }).Select(x => x.Trim()).Where(x => !string.IsNullOrWhiteSpace(x)); // ドメインが入力されていた場合 if (UsernameCollection.Count() == 2) { isSuccessNetworkConnect = networkUtility.Connect(externalHostsSaveTargetFolderPath, NetworkAuthenticationUsername, NetworkAuthenticationPassword); } // ドメインが入力されていなかった場合 else if (UsernameCollection.Count() == 1) { isSuccessNetworkConnect = networkUtility.Connect(externalHostsSaveTargetFolderPath, HostName + "\\" + NetworkAuthenticationUsername, NetworkAuthenticationPassword); } // それ以外の場合は中止 else { isSuccessNetworkConnect = false; } } else { isSuccessNetworkConnect = networkUtility.Connect(); } // 接続成功の場合 if (isSuccessNetworkConnect) { eventLog.WriteEntry("Succeeded connecting to " + externalHostsSaveTargetFolderPath, EventLogEntryType.Information); // Hostsをアップデート externalHostsStrings = UpdateExternalHosts(strExternalHostsSaveTarget); // ネットワーク切断と破棄 if (isSuccessNetworkConnect) { networkUtility.Disconnect(); eventLog.WriteEntry("Disconnected to " + externalHostsSaveTargetFolderPath, EventLogEntryType.Information); } networkUtility = null; } // 接続失敗の場合 else { eventLog.WriteEntry("Failed connecting to " + externalHostsSaveTargetFolderPath, EventLogEntryType.Information); } } } // 外部Hostsがローカルだった場合 else { eventLog.WriteEntry(externalHostsSaveTargetFolderPath + " is local path.", EventLogEntryType.Information); // 外部Hostsをアップデート externalHostsStrings = UpdateExternalHosts(strExternalHostsSaveTarget); } // 外部Hostsから取得した文字列がNullか空でないか確認 if (!string.IsNullOrEmpty(externalHostsStrings)) { // 内部Hostsをアップデート UpdateInternalHosts(externalHostsStrings); } } } UpdateNextPoll(); } } }