1

我认为这将是一个足够简单的脚本。我在这里看到了这篇关于如何使用 powershell 将文件夹重定向到 OneDrive 的文章:https ://stealthpuppy.com/onedrive-intune-folder-redirection/

我意识到这个脚本对我不起作用,因为它的编写方式需要用户上下文并且不能使用任务计划程序静默运行,所以我开始尝试使用系统上下文“重写”脚本。除了我似乎无法理解的一大块之外,一切似乎都在工作。我认为它是 C#,我只熟悉 powershell。我只关心重定向下载文件夹,所以他就是我所拥有的。

#These are the potential GUIDs for the Downloads KFM path of the user
$Guids = $null
$Guids = @()
$Guids += [pscustomobject]@{
        Guid = '{374DE290-123F-4565-9164-39C4925E467B}'
        Paths = @()
        }
$Guids += [pscustomobject]@{
        Guid = '{7d83ee9b-2244-4e70-b1f5-5393042af1e4}'
        Paths = @()
        }

#Log Variables
$timestamp = Get-Date -Format o | ForEach-Object { $_ -replace ":", "." }
$LogPath = "$env:USERPROFILE\AppData\Local\Intune-PowerShell-Logs\OneDriveSync-$timestamp.txt"

Start-Transcript -Path $LogPath

$CurrentUsers = Get-ItemProperty -path  "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\*" | Where {($_.ProfileImagePath -notmatch '.NET') -and ($_.ProfileImagePath -notmatch 'Default') -and ($_.ProfileImagePath -match "Users")} | select ProfileImagePath,PSChildName

ForEach ($CurrentUser in $CurrentUsers)
{
    $SourcePath = "$($CurrentUser.ProfileImagePath)\Downloads"
    $Targetpath = "$($CurrentUser.ProfileImagePath)\OneDrive\Downloads"
    $Rootpath = "HKU:\$($CurrentUser.PSChildName)"
    $ShellFolderspath = "$RootPath\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
    $UserShellFolderspath = "$Rootpath\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"
    
    #region 1 - Identify registry keys to update
    New-PSDrive -Name HKU -PSProvider Registry -Root HKEY_USERS -ErrorAction SilentlyContinue
    #Adding Downloads Guids to array
    ForEach ($object in $Guids)
    {
        #Check Shell Folders Path
        If ($Item = Get-ItemProperty $ShellFolderspath -Name $object.Guid -ErrorAction SilentlyContinue)
        {
        "$($object.guid) found in Shell Folders path"
        $Object.paths += @($Item.PSpath)
        }
        
        #Check User Shell Folders Path
        If ($Item = Get-ItemProperty $UserShellFolderspath -Name $object.Guid -ErrorAction SilentlyContinue)
        {
        "$($object.guid) found in User Shell Folders path"
        $Object.paths += @($Item.PSpath)
        }
    }
    #endregion
    
#region 2
# Define SHSetKnownFolderPath if it hasn't been defined already
$Type = ([System.Management.Automation.PSTypeName]'KnownFolders').Type
If (-not $Type) 
{
$Signature = @'
[DllImport("shell32.dll")]
public extern static int SHSetKnownFolderPath(ref Guid folderId, uint flags, IntPtr token, [MarshalAs(UnmanagedType.LPWStr)] string path);
'@
$Type = Add-Type -MemberDefinition $Signature -Name 'KnownFolders' -Namespace 'SHSetKnownFolderPath' -PassThru
}

#Test if new directory exists
If (!(Test-Path -Path $Targetpath -PathType Container))
{
    New-Item -Path $TargetPath -Type Directory -Force
}
#Validate the path
If (Test-Path $TargetPath -PathType Container) 
{
    #Call SHSetKnownFolderPath
    #return $Type::SHSetKnownFolderPath([ref]$KnownFolders[$KnownFolder], 0, 0, $Path)
    ForEach ($object in $Guids) 
    {
        $result = $Type::SHSetKnownFolderPath([ref]$object.guid, 0, 0, $Targetpath)
        If ($result -ne 0) 
        {
            $errormsg = "Error redirecting $($Object.guid). Return code $($result) = $((New-Object System.ComponentModel.Win32Exception($result)).message)"
            Throw $errormsg
        }
    }
} 
Else 
{
    Throw New-Object System.IO.DirectoryNotFoundException "Could not find part of the path $Path."
}

#endregion

#region 3 - Set new downloads directory
ForEach ($Object in $Guids)
{
    ForEach ($path in $object.paths)
    {
        Set-ItemProperty -Path $path -Name $object.Guid -Value $Targetpath -Verbose
    }
}
#endregion

#region 4
#Move files from old directory to the new one
#Robocopy.exe "$SourcePath" "$Targetpath" /E /MOV /XJ /XF *.ini /R:1 /W:1 /NP
#endregion
#}
}
    
    Stop-Transcript

除了我在第 74 行收到一条错误消息外,似乎一切正常:“重定向 {374DE290-123F-4565-9164-39C4925E467B} 时出错。返回码 -2147024894 = 系统找不到指定的文件”

我花了几乎一整天的时间试图解决这个问题,但一无所获。任何帮助,将不胜感激!

4

1 回答 1

1

你有两个问题:

  • 直接的技术问题:The system cannot find the file specified意味着无法识别指定的KNOWNFOLDERID GUID。

    • 也就是说,在您的两个 GUID 中,它是未知的{7d83ee9b-2244-4e70-b1f5-5393042af1e4},而不是您的错误消息中提到的那个(下载文件夹)。{374DE290-123F-4565-9164-39C4925E467B}
  • 一个概念性问题:您试图调用特定用户SHSetKnownFolderPath,这要求您传递一个代表感兴趣用户的所谓访问令牌作为参数。hToken

    • 由于您正在传递0for hToken,因此您始终为当前用户进行更新。

如果您想避免通过LogonUserWinAPI 函数获取代表其他用户的访问令牌的额外复杂性,您可以绕过SHSetKnownFolderPath调用并直接写入注册表,就像您的代码部分已经做的那样;但是,请注意,虽然这在撰写本文时应该有效,但不鼓励这样做,并且可能在将来的某个时候停止工作。

于 2021-02-16T17:23:51.427 回答