首页 > 编程问答 >Azure VM 中的 OneDrive

Azure VM 中的 OneDrive

时间:2024-07-21 03:35:49浏览次数:13  
标签:python azure cloud virtual-machine

我对 Azure 有点陌生。我想要完成的是拥有一个安装了 OneDrive 的虚拟机,并使用 runbook 将其打开,运行存储在 SharePoint 文件夹中的 python 脚本,该脚本将使用 api 来查询一些信息并创建文件来存储在另一个 SharePoint 文件夹中。然后将其关闭。 问题是,目前我可以运行脚本,但它无法同步,除非我连接到它,我想避免这种情况,因为我希望它是一个自动化过程。 这是我的 Runbook 代码,上面我在 VM 中有路由:

# Function to run a Python script
function Run-PythonScript {
    param (
        [string]$PythonExecutable,
        [string]$ScriptPath
    )

    $escapedScriptPath = $ScriptPath -replace '\\', '\\\\'

    $command = @"
& '$PythonExecutable' '$escapedScriptPath'
"@

    try {
        $response = Invoke-AzVMRunCommand -ResourceGroupName $ResourceGroupName -VMName $VMName -CommandId 'RunPowerShellScript' -ScriptString $command -ErrorAction Stop

        if ($response) {
            $response.Value | ForEach-Object {
                $logMessage = "Command execution output for ${ScriptPath}: " + $_.Message
                Write-Output $logMessage
            }
        } else {
            $noResponseMessage = "No response received from the VM command execution for ${ScriptPath}."
            Write-Output $noResponseMessage
        }
    } catch {
        $errorMessage = "Error executing ${ScriptPath}: $_"
        Write-Output $errorMessage
    }
}

# Main Script Execution

# Login to Azure using Managed Identity
$AzureContext = (Get-AzContext)
if ($AzureContext -eq $null) {
    Connect-AzAccount -Identity
}

# Run OneDrive sync script
Write-Output "Running OneDrive sync script..."
Run-PythonScript -PythonExecutable $PythonExecutable -ScriptPath $OneDriveSyncScript

# Run all other scripts sequentially
foreach ($scriptPath in $ScriptPaths) {
    Run-PythonScript -PythonExecutable $PythonExecutable -ScriptPath $scriptPath
}

# Log completion of the runbook
$runbookCompletedMessage = "Runbook execution completed."
Write-Output $runbookCompletedMessage

所以我使用 Runbook 尝试了很多不同的情况,例如尝试执行 OneDrive 文件,但它告诉我该文件不存在,或者该文件夹不存在。 有什么建议吗?或者可能改变方法? 提前致谢


提出的问题是许多人试图在 Azure 中实现无人值守自动化时遇到的常见问题。是对的,手动连接到 VM 来同步 OneDrive 不是一个可扩展的解决方案。

好消息是,有几种方法可以解决这个问题。让我们来探讨一下这些方法以及为什么一种方法可能比另一种方法更适合的情况。

了解问题:

核心问题是 OneDrive 通常依赖于与用户帐户交互的图形用户界面 (GUI) 来进行同步。当通过 Runbook 运行脚本时,实际上并没有以交互方式登录用户会话,因此 OneDrive 同步客户端无法完成其工作。

解决方案:

  1. 使用不依赖于 OneDrive 的 SharePoint API:

  2. 这是最直接且可能最可靠的长期解决方案。与其依赖于 OneDrive 同步,不如直接使用 SharePoint API 在脚本中与的 SharePoint 文件进行交互。

  3. 优势:
    • 无需 OneDrive 同步,使自动化更加可靠。
    • 更好的控制和粒度,用于文件操作。
  4. 劣势:
    • 需要更多代码和对 SharePoint API 的理解。

示例 (使用 Python): ```python from office365.sharepoint.client_context import ClientContext from office365.runtime.auth.client_credential import ClientCredential

client_id = 'YOUR_APPLICATION_ID' client_secret = 'YOUR_APPLICATION_SECRET' sharepoint_site_url = 'YOUR_SHAREPOINT_SITE_URL'

credentials = ClientCredential(client_id, client_secret) ctx = ClientContext(sharepoint_site_url).with_credentials(credentials)

# 获取文件 file_url = '/Shared Documents/YourFile.txt' file = ctx.web.get_file_by_server_relative_url(file_url).execute_query() print(file.properties['Name'])

# 上传文件 with open('./data/MyFile.txt', 'rb') as content_file: file_content = content_file.read() ctx.web.get_folder_by_server_relative_url('/Shared Documents').upload_file('MyFile.txt', file_content).execute_query() print("File uploaded") ```

  1. 使用无头 OneDrive 客户端:

  2. 有一些工具像 rclone 可以与 OneDrive 进行交互,而无需 GUI。可以在 VM 上安装 rclone ,并使用 Runbook 触发 rclone 命令进行同步。

  3. 优势:
    • 比使用完整的 OneDrive 客户端更轻量级。
  4. 劣势:
    • 可能需要一些配置和故障排除。
    • 与直接使用 SharePoint API 相比,控制更少。

示例 (使用 rclone): ```bash # 配置 rclone (只需运行一次) rclone config create onedrive microsoft_graph

# 同步文件夹 rclone sync /path/to/local/folder onedrive:/SharePoint/Folder ```

  1. 使用计划任务和用户上下文:

  2. 可以在 VM 上创建一个计划任务,该任务以特定用户身份运行,该用户具有 OneDrive 同步的权限。可以使用 Runbook 来触发此计划任务。

  3. 优势:
    • 利用现有的 OneDrive 客户端。
  4. 劣势:
    • 用户帐户需要始终保持登录状态,或者至少在计划任务运行时登录,这可能不理想。
    • 不如其他选项安全。

无论选择哪种方法,请务必考虑安全隐患。使用服务主体或其他安全凭据来访问的 SharePoint 数据,而不是存储硬编码的用户名和密码。

标签:python,azure,cloud,virtual-machine
From: 78697841

相关文章

  • python 舰队容器
    我正在尝试使用容器在flet中制作一个菜单,它应该是半透明的,但其中的项目不是。我尝试将opacity=1分配给元素,但没有成功-它们与容器一样透明感谢任何帮助我的代码:nickname=ft.TextField(label="xxx",hint_text="xxx")column=ft.Column(controls=[nickname......
  • Python应用程序跨子包共享的配置文件
    我正在构建一个应用程序来控制一些硬件。我在包中实现了不同类型的硬件:电机和测量设备。我的文件结构如下:name_of_my_app/__init__.pymain.pyconfig.iniCONFIG.pymotors/__init__.pyone_kind_of_motor.pymeasurement_devices/......
  • python中时间序列数据的梯度计算
    我正在尝试编写一个函数,它可以从最适合下面的线返回梯度dataframe在浏览了谷歌的几个资源之后,我仍然不确定这是如何完成的。我明白最佳拟合线的计算公式为:y=mx+b将因变量(y)设置为foos,将自变量(x)设置为DateTimeDatafram......
  • 调试用 C 编写的 Python 扩展
    我非常熟悉编写C代码,并且很擅长编写Python代码。我正在尝试学习如何用C编写可以从OSX10.15.7上的Python-3.9.X调用的模块。我已经得到了几个“helloworld”类型的示例,但是对于复杂的示例,我正在努力弄清楚如何调试我编写的C扩展。MWE:src/add.c//......
  • 具有块大小选项的 Python pandas read_sas 因索引不匹配而失败并出现值错误
    我有一个非常大的SAS文件,无法容纳在我的服务器内存中。我只需要转换为镶木地板格式的文件。为此,我使用pandas中chunksize方法的read_sas选项分块读取它。它主要是在工作/做它的工作。除此之外,一段时间后它会失败并出现以下错误。此特定SAS文件有794......
  • 使用 requests 包 python 时打开文件太多
    我正在使用Pythonrequests包向API发出大量请求。然而,在某些时候,我的程序由于“打开的文件太多”而崩溃。当我明确关闭我的会话时,我真的不知道这是怎么回事。我使用以下代码:importrequestsimportmultiprocessingimportnumpyasnps=requests.session()s.keep......
  • Python 是一种选择性解释语言吗?为什么下面的代码不起作用?
    由于程序是从上到下运行的,为什么下面的代码不执行块中的第一行就直接抛出错误?if5>2:print("TwoislessthanFive!")print("Fiveisgreaterthantwo!")错误:文件“/Users/____/Desktop/Pythonpractise/practise.py”,第3行print("五比二大!")Indentati......
  • 裁剪时间变量 Python Matplotlib Xarray
    我不确定这是否是一个愚蠢的问题,但我想按时间变量剪辑.nc文件。我在xarray中打开了数据集,但以下ds.sel行(之前已运行)仅返回错误。ds=xr.open_dataset('/Users/mia/Desktop/RMP/data/tracking/mcs_tracks_2015_11.nc')selected_days=ds.sel(time=slice('2015-11-22',......
  • 用于匹配两个数据列表中的项目的高效数据结构 - python
    我有两个列表,其中一个列表填充ID,另一个列表填充进程名称。多个进程名称可以共享一个ID。我希望能够创建一个可以使用特定ID的数据结构,然后返回与该ID关联的进程列表。我还希望能够使用特定的进程名称并返回与其连接的ID列表。我知道我可以为此创建一个字典,但是I......
  • 有人可以解决我的代码中的问题吗?而且我无法在我的电脑上安装 nsetools。如何在 python
    从nsetools导入Nseimportpandasaspdnse=Nse()all_stock_codes=nse.get_stock_codes()companies_with_low_pe=[]对于all_stock_codes中的代码:如果代码=='符号':继续尝试:stock_quote=nse.get_quote(代码)pe_ratio=stock_quote.get('priceT......