在Windows中获取OneDrive路径

本文关键字:OneDrive 路径 获取 Windows | 更新日期: 2023-09-27 18:29:30

我有一个C#WPF应用程序,我正在尝试找到一种方法来获取Windows中OneDrive根目录的路径。我如何通过编程实现这一点?我在网上搜索过,但什么也找不到。我希望我能提供一些代码,但我一无所知;我的意思是,我检查了系统环境变量,但在我的机器上找不到任何东西,我认为这可能是一个有效的解决方案,但没有找到任何东西。

在Windows中获取OneDrive路径

随着windows 10的最新更新,微软引入了新的环境变量%OneDrive%,我在2017年4月的更新(创建者更新)中检查了它,它就在那里。

这对我有效(Windows 10 Pro,1803):

 var oneDrivePath = Environment.GetEnvironmentVariable("OneDriveConsumer");

在我的Windows 8.1计算机上,保存此信息的注册表项是:HKEY_CURRENT_USER'Software'Microsoft'Windows'CurrentVersion'SkyDrive'UserFolder

我会尝试使用Registry.GetValue()方法:

        const string userRoot = "HKEY_CURRENT_USER";
        const string subkey = @"Software'Microsoft'Windows'CurrentVersion'SkyDrive";
        const string keyName = userRoot + "''" + subkey;
        string oneDrivePath = (string)Registry.GetValue(keyName,
        "UserFolder",
        "Return this default if NoSuchName does not exist.");
        Console.WriteLine("'r'n OneDrivePath : {0}", oneDrivePath);

我还找到了以下路径:

HKEY_LOCAL_MACHINE'SOFTWARE'Microsoft'Windows'CurrentVersion'Explorer'SyncRootManager'SkyDrive'UserSyncRoots'S-1-5-21-2696997101-1021499815-432504798-1004

HKEY_USERS'S-1-5-21-2696997101-1021499815-432504798-1004'Software'Microsoft'Windows'CurrentVersion'SkyDrive'UserFolder

我使用常量FOLDRID_SkyDrive获取OneDrive文件夹的位置(https://msdn.microsoft.com/library/dd378457.aspx)以及//检测AppData''LocalLow的位置的答案中的"GetKnownFolderPath"方法。

尽管环境变量"USERPROFILE"与"''OneDrive"组合有时会起作用,但如果用户移动了OneDrive文件夹,该环境变量实际上将是一个重新分析点,而不是实际位置。

在Windows 10 上测试

Guid FOLDERID_SkyDrive = new Guid("A52BBA46-E9E1-435f-B3D9-28DAA648C0F6");
location = GetKnownFolderPath(FOLDERID_SkyDrive);

为了完整性,似乎有3个环境变量集:OneDriveOneDriveConsumerOneDriveCommercial

在我的情况下,第一个和最后一个是相同的(我的OneDrive for Business帐户),中间一个是我的个人OneDrive。我在加入域的PC和未加入域的电脑上都看到了相同的结果,但都配置了OneDrive。在一台只有我的个人OneDrive的非域加入PC上,OneDrive环境变量指向个人OneDrive。

我找不到任何Microsoft文档,但我认为最好忽略OneDrive变量,只使用OneDriveConsumer/OneDriveCommercial变量来查找OneDrive文件夹。

Steve

如果您正在使用PowerShell,您可以使用以下命令:

$ENV:onedrive

    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
             const string userRoot = "HKEY_CURRENT_USER";
             const string subkey = @"Software'Microsoft'OneDrive";
             const string keyName = userRoot + "''" + subkey;
             string oneDrivePath = (string)Microsoft.Win32.Registry.GetValue(keyName,
                "UserFolder",
               "Return this default if NoSuchName does not exist.");
             Console.WriteLine("'r'n OneDrivePath : {0}", oneDrivePath);
            string Onedrivepath= string.Format(oneDrivePath);
             label1 .Text = string.Format(Onedrivepath);
        }
        catch (Exception)
        {
            /// throw;
        }
    }

要跟踪这些onedrive环境变量(它将显示以"一"开头的所有环境变量):

来自CMD:

$>set one
OneDrive=C:'Users'my_username'OneDrive - COMPANY
OneDriveCommercial=C:'Users'my_username'OneDrive - COMPANY
OneDriveConsumer=C:'Users'my_username'OneDrive

来自PowerShell:

$>dir env: | Where-Object {$_.Name -like "one*"}
OneDrive=C:'Users'my_username'OneDrive - COMPANY
OneDriveCommercial=C:'Users'my_username'OneDrive - COMPANY
OneDriveConsumer=C:'Users'my_username'OneDrive

$>Get-ChildItem env: | Where-Object {$_.Name -like "one*"}
OneDrive=C:'Users'my_username'OneDrive - COMPANY
OneDriveCommercial=C:'Users'my_username'OneDrive - COMPANY
OneDriveConsumer=C:'Users'my_username'OneDrive

我认为注册表是Smashing1978提到的,但我在HKEY_CURRENT_USER''Software''Microsoft''Windows''CurrentVersion''SkyDrive下没有UserFolder项。

你能使用%UserProfile%''SkyDrive路径吗?

您必须在注册表下找到路径。。。首先从搜索框中运行regedit,然后在软件下-Microsoft-查找OneDrive此处的图像描述

然后为您的子密钥字符串使用该路径

const string subkey=@"软件''Microsoft''OneDrive";

解决方案源代码在这里

在VBA中使用Environ("OneDriveConsumer")

注册表在某些PC上不适用。然而,这对我有效:

using System;
using System.IO;
DirectoryInfo di = DirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments));
string path = di.Parent.FullName;

我只是略读了一下,但发现了一些问题&答案。这个问题问";。。。我正在尝试找到一种方法来获取OneDrive根目录的路径&";。我正在使用Win11&Win10(具体版本为10.0.19044)。两者都显示了与OneDrive设置相同的详细信息

OneDrive有两个路径需要考虑:缓存文件/文件夹的本地PC路径&包含所有内容的实际OneDrive路径。Windows允许用户在本地缓存所有或仅选定的文件/目录。所有的答案都集中在本地路径上。我提供了另一组详细信息,因为这会在资源管理器中打开OneDrive,而不是网页或本地缓存。这也回答了所问的问题,但使用OneDrive而不是本地缓存。

获取HKCU''Software''Microsoft''OneDrive''Accounts''Personal的值:cid(字符串值)。这是UNC路径所需的ID。UNC是:''''d.docs.live.net@SSL''[无论注册表CID是什么]。这将使你获得OneDrive中的所有内容,而不仅仅是PC上本地缓存的内容。你甚至可以将驱动器映射到UNC路径&它是有效的。

我还没有将其与OneDrive@work进行比较,但我会的。

海报是在寻找本地路径还是完整的OneDrive路径?

对于本地缓存路径,它在这里:HKCU''Software''Microsoft''OneDrive''Accounts''Personal value:UserFolder(字符串值)

依赖操作系统变量将您与特定版本的Win10或更高版本联系在一起,这可能不是一个好主意,具体取决于您的交付受众。我所描述的内容涵盖了本地缓存+整个OneDrive。

(您不需要SID或必须将SID转换为名称,也不需要使用不一定存在的操作系统变量)