C# 在Windows中获取OneDrive路径

C# 在Windows中获取OneDrive路径,c#,.net,wpf,path,onedrive,C#,.net,Wpf,Path,Onedrive,我有一个C#WPF应用程序,我正试图找到一种方法来获取Windows中根OneDrive目录的路径。如何以编程方式执行此操作?我在网上搜索过,但什么也没找到。我希望我能提供一些代码,但我没有线索;我的意思是,我检查了系统环境变量,在我的机器上找不到任何东西,我认为这可能是一个有效的解决方案,但它没有显示任何东西。在我的Windows 8.1计算机上,保存此信息的注册表项是:HKEY\U CURRENT\U USER\Software\Microsoft\Windows\CurrentVersio

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

在我的Windows 8.1计算机上,保存此信息的注册表项是:
HKEY\U CURRENT\U USER\Software\Microsoft\Windows\CurrentVersion\SkyDrive\UserFolder

我会尝试使用以下方法:


我还在下面找到了路径:

HKEY\U LOCAL\U 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


您可以使用%UserProfile%\SkyDrive路径吗?

我使用常量FOLDERID\u SkyDrive()和答案中的“GetKnownFolderPath”方法获取OneDrive文件夹的位置

虽然环境变量“USERPROFILE”与“\OneDrive”组合有时会起作用,但如果用户移动了他们的OneDrive文件夹,环境变量实际上将是一个重新分析点,而不是实际位置

在Windows10上测试

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

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

然后将该路径用于子键字符串

const string subkey=@“Software\Microsoft\OneDrive”


随着windows 10的最新更新,Microsoft引入了新的环境变量%OneDrive%,我在2017年4月的更新(Creators update)中检查了它,它就在那里

这对我很有用(Windows10Pro,1803):


在VBA使用环境(“OneDriveConsumer”)

中,为完整起见,似乎设置了3个环境变量: OneDrive OneDriveConsumer OneDriveCommercial

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

我找不到任何有关此的Microsoft文档,但我认为最好忽略OneDrive变量,只使用消费者/商业文档来查找OneDrive文件夹


Steve

如果您使用的是PowerShell,您可以使用:


$ENV:onedrive

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

using System;
using System.IO;

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

要跟踪这些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


“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\SyncRootManager\SkyDrive\UserSyncRoots”怎么办?我的注册表中有一个条目,它位于“S-1-5-21-3897053772-1539939438-3998215170-1142”项下,这是您当前用户配置文件的安全标识符。我认为这是目前已知的唯一检测OneDrive路径的方法。我不建议您使用最后两条路径,您还需要获取用户SID。从技术上讲,如果当前用户在那里看到了SID,那么最后一条路径就是第一条路径。目前它位于
HKEY\U current\U user\Software\Microsoft\OneDrive
,Value
UserFolder
任何人都知道如何在Mac OS X?C上执行此操作。如果我理解正确,这意味着它是“自动”托管代码。我的完整方法:[code]公共静态字符串GetOneDriveLocation(){var userPath=Environment.GetEnvironmentVariable(“USERPROFILE”);var di=new DirectoryInfo(System.IO.Path.Combine(userPath,“OneDrive”);var location=di.FullName;if(di.Attributes.HasFlag(FileAttributes.ReparsePoint)){Guid FOLDERID\u SkyDrive=new Guid(“A52BBA46-E9E1-435f-B3D9-28DAA648C0F6”);位置=GetKnownFolderPath(FOLDERID_SkyDrive);}返回位置;}[/code]欢迎来到SO!你能提供更多关于你发布的代码的信息和解释吗?
$ENV:OneDriveConsumer
和Steve Rochford的输入。
%OneDrive%
如果你的电脑上只有一个或默认的OneDrive客户端。如果没有,
%OneDriveConsumer%
用于个人OneDrive和
%OneDriveCommercial%
对于OneDrive for Business。
using System;
using System.IO;

DirectoryInfo di = DirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments));
string path = di.Parent.FullName;
$>set one
OneDrive=C:\Users\my_username\OneDrive - COMPANY
OneDriveCommercial=C:\Users\my_username\OneDrive - COMPANY
OneDriveConsumer=C:\Users\my_username\OneDrive
$>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