有没有办法从 C# WPF 应用程序刷新 DNS 缓存? (在 XP、Vista、Win7 上)

发布于 2024-09-14 18:54:33 字数 69 浏览 8 评论 0原文

有没有办法从 C# WPF 应用程序刷新 DNS 缓存?该应用程序可以在 XP、Vista 或 Windows 7 上运行。

Is there a way to flush the DNS cache from a C# WPF app? The application would be running on either XP, Vista, or Windows 7.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

原来分手还会想你 2024-09-21 18:54:33

您可以使用 Microsoft 的“dnsapi.dll”中的函数。这将允许您完全以编程方式执行此操作:

using System.Runtime.InteropServices;

[DllImport("dnsapi.dll",EntryPoint="DnsFlushResolverCache")]
private static extern UInt32 DnsFlushResolverCache ();

public static void FlushMyCache() //This can be named whatever name you want and is the function you will call
{
    UInt32 result = DnsFlushResolverCache();
}

我已经对此进行了测试,并且效果很好。

You can use a function from Microsoft's "dnsapi.dll". This will allow you to do this completely programmatically:

using System.Runtime.InteropServices;

[DllImport("dnsapi.dll",EntryPoint="DnsFlushResolverCache")]
private static extern UInt32 DnsFlushResolverCache ();

public static void FlushMyCache() //This can be named whatever name you want and is the function you will call
{
    UInt32 result = DnsFlushResolverCache();
}

I have tested this and it works great.

故乡的云 2024-09-21 18:54:33

这可能是穷人的解决方案,但您可以使用 System.Diagnostics.Process 启动 ipconfig /flushdns 。

This may be the poor-man's solution, but you could use System.Diagnostics.Process to launch ipconfig /flushdns.

墟烟 2024-09-21 18:54:33

我在互联网上搜索,找不到刷新单个 DNS 条目的方法。致力于故障转移到备份数据中心的工作,这对我来说是需要的。我拆解了 DnsFlushResolverCacheEntry_W 并提出了下面的 p/invoke sig。我将 DnsQuery 方法与 QueryNoWireFlag 和 NoHostFile 标志一起使用。如果有任何结果,我会打电话
DnsFlushResolverCacheEntry_W。对于将来想要做同样事情的人来说,这可能是一个很好的信息

/// <summary>
        /// Removes all related DNS records for the given hostname from the DNS resolver cache.
        /// </summary>
        /// <param name="hostName">The host name to flush from the resolver cache.</param>
        /// <returns>Returns 1 if successful, zero if failed.  No other error information is returned.</returns>
        /// <remarks>
        /// DnsFlushResolverCacheEntry_W is an undocumented method.  From dissembler this method has two possible 
        /// return values 0 or 1.  If the argument is null or the _R_ResolverFlushCacheEntry returns something 
        /// other than zero than the return value is zero.  When _R_ResolverFlushCacheEntry returns zero the 
        /// return value is 1.  Based off this and testing of the method it is assumed that 1 is used to indicate success.  
        /// After calling this method querying the DNS resolver cache returns no results.
        /// 
        /// __stdcall DnsFlushResolverCacheEntry_W(x)
        /// ....
        /// 6DC12729 xor     esi, esi                       // Zero esi
        /// 6DC1272B cmp     [ebp+arg_0], esi               // check if the hostname is null
        /// 6DC1272E jz      loc_6DC1D8B8                   // Jump to end, return value is 0.
        /// 6DC12734 mov     [ebp+ms_exc.registration.TryLevel], esi
        /// 6DC12737 push    esi                            // Push 3 args for method, 2nd is hostname, others null
        /// 6DC12738 push    [ebp+arg_0]
        /// 6DC1273B push    esi
        /// 6DC1273C call    _R_ResolverFlushCacheEntry@12  // call this method 
        /// 6DC12741 mov     [ebp+var_1C], eax              // store return value in local
        /// 6DC12744 mov     [ebp+ms_exc.registration.TryLevel], 0FFFFFFFEh
        /// 6DC1274B
        /// 6DC1274B loc_6DC1274B:                           
        /// 6DC1274B cmp     [ebp+var_1C], esi           
        /// 6DC1274E jnz     loc_6DC1D8E7                   // Error?  jump to block that does etw then return 0
        /// 6DC12754 xor     eax, eax                       // Success?  Set eax to zero
        /// 6DC12756 inc     eax                            // result is 0, increment by 1.  success return value is 1
        /// 6DC12757 call    __SEH_epilog4
        /// 6DC1275C retn    4
        /// 
        /// 6DC1D8B8 xor     eax, eax                       // set return value to zero
        /// 6DC1D8BA jmp     loc_6DC12757                   // jump to end
        /// 
        /// 6DC1D8E7 mov     eax, _WPP_GLOBAL_Control
        /// 6DC1D8EC cmp     eax, offset _WPP_GLOBAL_Control
        /// 6DC1D8F1 jz      short loc_6DC1D8B8
        /// 6DC1D8F3 test    byte ptr [eax+1Ch], 40h
        /// 6DC1D8F7 jz      short loc_6DC1D8B8 // This is probably testing some flag that is used to indicate if ETW is enabled
        /// 6DC1D8F9 push    [ebp+var_1C]
        /// 6DC1D8FC push    offset dword_6DC22494
        /// 6DC1D901 push    0Dh
        /// 6DC1D903 push    dword ptr [eax+14h]
        /// 6DC1D906 push    dword ptr [eax+10h]
        /// 6DC1D909 call    _WPP_SF_q@20    ; WPP_SF_q(x,x,x,x,x)      // This method does some ETW tracing
        /// 6DC1D90E jmp     short loc_6DC1D8B8
        /// </remarks>
        [DllImport("dnsapi.dll", EntryPoint = "DnsFlushResolverCacheEntry_W", CharSet = CharSet.Unicode)]
        public static extern int DnsFlushResolverCacheEntry(string hostName);

I searched on the internet and couldnt find away to flush a single dns entry. Working on something for failing over to backup datacenter this is needed for me. I dissembled the DnsFlushResolverCacheEntry_W and came up with the p/invoke sig below. I use the DnsQuery method with the QueryNoWireFlag and NoHostFile flag. If there are any results then I call
DnsFlushResolverCacheEntry_W. This might be good info for someone in the future looking to do the same

/// <summary>
        /// Removes all related DNS records for the given hostname from the DNS resolver cache.
        /// </summary>
        /// <param name="hostName">The host name to flush from the resolver cache.</param>
        /// <returns>Returns 1 if successful, zero if failed.  No other error information is returned.</returns>
        /// <remarks>
        /// DnsFlushResolverCacheEntry_W is an undocumented method.  From dissembler this method has two possible 
        /// return values 0 or 1.  If the argument is null or the _R_ResolverFlushCacheEntry returns something 
        /// other than zero than the return value is zero.  When _R_ResolverFlushCacheEntry returns zero the 
        /// return value is 1.  Based off this and testing of the method it is assumed that 1 is used to indicate success.  
        /// After calling this method querying the DNS resolver cache returns no results.
        /// 
        /// __stdcall DnsFlushResolverCacheEntry_W(x)
        /// ....
        /// 6DC12729 xor     esi, esi                       // Zero esi
        /// 6DC1272B cmp     [ebp+arg_0], esi               // check if the hostname is null
        /// 6DC1272E jz      loc_6DC1D8B8                   // Jump to end, return value is 0.
        /// 6DC12734 mov     [ebp+ms_exc.registration.TryLevel], esi
        /// 6DC12737 push    esi                            // Push 3 args for method, 2nd is hostname, others null
        /// 6DC12738 push    [ebp+arg_0]
        /// 6DC1273B push    esi
        /// 6DC1273C call    _R_ResolverFlushCacheEntry@12  // call this method 
        /// 6DC12741 mov     [ebp+var_1C], eax              // store return value in local
        /// 6DC12744 mov     [ebp+ms_exc.registration.TryLevel], 0FFFFFFFEh
        /// 6DC1274B
        /// 6DC1274B loc_6DC1274B:                           
        /// 6DC1274B cmp     [ebp+var_1C], esi           
        /// 6DC1274E jnz     loc_6DC1D8E7                   // Error?  jump to block that does etw then return 0
        /// 6DC12754 xor     eax, eax                       // Success?  Set eax to zero
        /// 6DC12756 inc     eax                            // result is 0, increment by 1.  success return value is 1
        /// 6DC12757 call    __SEH_epilog4
        /// 6DC1275C retn    4
        /// 
        /// 6DC1D8B8 xor     eax, eax                       // set return value to zero
        /// 6DC1D8BA jmp     loc_6DC12757                   // jump to end
        /// 
        /// 6DC1D8E7 mov     eax, _WPP_GLOBAL_Control
        /// 6DC1D8EC cmp     eax, offset _WPP_GLOBAL_Control
        /// 6DC1D8F1 jz      short loc_6DC1D8B8
        /// 6DC1D8F3 test    byte ptr [eax+1Ch], 40h
        /// 6DC1D8F7 jz      short loc_6DC1D8B8 // This is probably testing some flag that is used to indicate if ETW is enabled
        /// 6DC1D8F9 push    [ebp+var_1C]
        /// 6DC1D8FC push    offset dword_6DC22494
        /// 6DC1D901 push    0Dh
        /// 6DC1D903 push    dword ptr [eax+14h]
        /// 6DC1D906 push    dword ptr [eax+10h]
        /// 6DC1D909 call    _WPP_SF_q@20    ; WPP_SF_q(x,x,x,x,x)      // This method does some ETW tracing
        /// 6DC1D90E jmp     short loc_6DC1D8B8
        /// </remarks>
        [DllImport("dnsapi.dll", EntryPoint = "DnsFlushResolverCacheEntry_W", CharSet = CharSet.Unicode)]
        public static extern int DnsFlushResolverCacheEntry(string hostName);
梦初启 2024-09-21 18:54:33

试试这个 -

System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "/C ipconfig /flushdns";
process.StartInfo = startInfo;
process.Start();

Try this -

System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "/C ipconfig /flushdns";
process.StartInfo = startInfo;
process.Start();
诗化ㄋ丶相逢 2024-09-21 18:54:33

试试这个:

    static void flushDNS()
    {
        string flushDnsCmd = @"/C ipconfig /flushdns";
        try
        {
            var process = new Process
            {
                StartInfo = new ProcessStartInfo("cmd.exe", flushDnsCmd)

            };
            process.Start();
            
            process.WaitForExit();
            Console.WriteLine(String.Format("Successfully Flushed DNS:'{0}'", flushDnsCmd), EventLogEntryType.Information);

        }
        catch (Exception exp)
        {
            Console.WriteLine(String.Format("Failed to Flush DNS:'{0}' . Error:{1}", flushDnsCmd, exp.Message), EventLogEntryType.Error);
        }
    }

Try this :

    static void flushDNS()
    {
        string flushDnsCmd = @"/C ipconfig /flushdns";
        try
        {
            var process = new Process
            {
                StartInfo = new ProcessStartInfo("cmd.exe", flushDnsCmd)

            };
            process.Start();
            
            process.WaitForExit();
            Console.WriteLine(String.Format("Successfully Flushed DNS:'{0}'", flushDnsCmd), EventLogEntryType.Information);

        }
        catch (Exception exp)
        {
            Console.WriteLine(String.Format("Failed to Flush DNS:'{0}' . Error:{1}", flushDnsCmd, exp.Message), EventLogEntryType.Error);
        }
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文