有没有办法在c#中找到Teamviewer ID?

有没有办法在c#中找到Teamviewer ID?,c#,C#,我正在制作一个记录用户活动的程序,我希望能够获得Teamviewer ID并将其发送到日志,我知道如何通过将该信息分配给变量来将信息发送到日志,但是我不确定如何将Teamviewer ID传递给所述变量,并希望获得相关帮助 非常感谢所有帮助:)对于Windows 8中的TeamViewer 8,TeamViewer ID存储在HKEY\U LOCAL\U MACHINE\SOFTWARE\Wow6432Node\TeamViewer\Version8\ClientID中 从现在开始,只需在C#中

我正在制作一个记录用户活动的程序,我希望能够获得Teamviewer ID并将其发送到日志,我知道如何通过将该信息分配给变量来将信息发送到日志,但是我不确定如何将Teamviewer ID传递给所述变量,并希望获得相关帮助


非常感谢所有帮助:)

对于Windows 8中的TeamViewer 8,TeamViewer ID存储在HKEY\U LOCAL\U MACHINE\SOFTWARE\Wow6432Node\TeamViewer\Version8\ClientID中


从现在开始,只需在C#中读取注册表项,然后根据需要对其执行任何操作,如果需要,我将提供注册表读取代码:),但已经很好地解释了它!祝你好运

这就是我正在使用的

    public static string GetTeamviewerID()
    {
        var versions = new[] {"4", "5", "5.1", "6", "7", "8"}.Reverse().ToList(); //Reverse to get ClientID of newer version if possible

        foreach (var path in new[]{"SOFTWARE\\TeamViewer","SOFTWARE\\Wow6432Node\\TeamViewer"})
        {
            if (Registry.LocalMachine.OpenSubKey(path) != null)
            {
                foreach (var version in versions)
                {
                    var subKey = string.Format("{0}\\Version{1}", path, version);
                    if (Registry.LocalMachine.OpenSubKey(subKey) != null)
                    {
                        var clientID = Registry.LocalMachine.OpenSubKey(subKey).GetValue("ClientID");
                        if (clientID != null) //found it?
                        {
                            return Convert.ToInt32(clientID).ToString();
                        }
                    }
                }
            }
        }
        //Not found, return an empty string
        return string.Empty;
    }

版本10在注册表中的位置稍有不同

下面的代码适用于ver。10和更旧的版本。它还考虑了32位和64位操作系统之间的差异:

long GetTeamViewerId()
{
    try
    {
        string regPath = Environment.Is64BitOperatingSystem ? @"SOFTWARE\Wow6432Node\TeamViewer" : @"SOFTWARE\TeamViewer";
        RegistryKey key = Registry.LocalMachine.OpenSubKey(regPath);
        if (key == null)
            return 0;
        object clientId = key.GetValue("ClientID");
        if (clientId != null) //ver. 10
            return Convert.ToInt64(clientId);
        foreach (string subKeyName in key.GetSubKeyNames().Reverse()) //older versions
        {
            clientId = key.OpenSubKey(subKeyName).GetValue("ClientID");
            if (clientId != null)
                return Convert.ToInt64(clientId);
        }
        return 0;
    }
    catch (Exception e)
    {
        return 0;
    }
}

在某些情况下,接受的解决方案可能是正确的,但是ClientID可以位于注册表中的其他位置

  • 这取决于您是否使用64位操作系统。在64位操作系统上,您需要包括\Wow6432\
  • 有时注册表位置以一个版本结束(例如\Version9),但我也看到过这样的情况
  • 可能地点:

    • HKEY\U LOCAL\U MACHINE\SOFTWARE\Wow6432Node\TeamViewer\Version[版本]
    • HKEY\U LOCAL\U MACHINE\SOFTWARE\Wow6432Node\TeamViewer
    • HKEY\U LOCAL\U MACHINE\SOFTWARE\TeamViewer\Version[版本]
    • HKEY\U本地\U机器\软件\团队查看器\版本

    显然这些都过时了,但这是一个很好的开始,
    VBSCRIPT
    -
    C#
    -感谢您的快速响应,但是我在研究这个问题时看到了这些链接,我是C#的初学者,希望能有一个更清晰的解释这绝对是太棒了!非常好的回答,非常感谢:请看一下我的答案,还有其他注册表位置,您需要查看:注册表项是一次性的,所以应该在using语句中注册表项是一次性的,所以应该在using语句中。我想我的方法不会泄漏。但总的来说,是的,IDisposable对象应该得到适当的处理。这个答案可能更简洁,但在很多情况下都会失败,这不是一个好的解决方案。例如,请参阅Igor Gorjanc或Devsoft的答案。它很短,让程序员负责正确的版本路径。公平地说,对于某些特定的用例,它可能仍然有用。
    public static string TvId()
    {
        return Microsoft.Win32.Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\TeamViewer\\Version6", "ClientID", "FAILED").ToString();
    }