gpt4 book ai didi

powershell - 授予 MSysObjects 的读取权限

转载 作者:行者123 更新时间:2023-12-02 01:33:21 26 4
gpt4 key购买 nike

我需要获取数百个 MS Access DB 的元数据,因此我需要自动化元数据收集过程。
我想查询描述的内容 here ,但在查询数据库之前,我需要对 MSysObjects 进行读取 Access 表。

我不断收到以下错误:

Record(s) cannot be read; no read permission on 'MsysObjects'.



所以我挖得更深:

我在 C# 部分( see herethis one )中阅读了有关类似问题的文章。

我整理了一个简单的脚本,它可以很好地用于创建表等,但是我在设置读取 Access 权限时遇到了问题。
$ScrUsr = $(whoami)
Write-Host $ScrUsr

$cmd = "GRANT SELECT ON MSysObjects TO [$ScrUsr]"
Write-Host $cmd

Function Invoke-ADOCommand($Db)
{
$connection = New-Object -ComObject ADODB.Connection
$connection.Open("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=$db;" )
$command = New-Object -ComObject ADODB.Command
$command.ActiveConnection = $connection
$command.CommandText = $cmd
$rs = $command.Execute()
$connection.Close()
}

$Db = "C:\Temp\test1.accdb"

Invoke-ADOCommand -db $Db

执行脚本会引发以下错误原因:

Cannot open the Microsoft Office Access database engine workgroup information file.



如何允许对 MSysObjects 的读取权限?

最佳答案

您必须解决两个问题:

  • 在与 Access ACCDB 数据库交互时,您的代码将使用 Access 安全帐户“Admin”。其他 Access 安全帐户仅在您实现了 Access 用户级安全 (ULS) 时才可用,但该功能仅适用于 MDB 格式的数据库。因此,使用ACCDB,您不能GRANT除了“Admin”以外的任何帐户的任何内容。
  • 您必须在连接字符串中包含“系统数据库”的位置。

  • 如果您不知道在哪里可以找到 System 数据库,请打开 Access 并在“立即”窗口中检查此语句的输出。 (Ctrl+g 将打开立即窗口)

    Debug.Print Application.DBEngine.SystemDb

    我的系统数据库是 C:\Users\hans\AppData\Roaming\Microsoft\Access\System1.mdw 在下面的代码示例中替换你的。

    我不是很精通 Powershell,但是这个例子对我来说没有错误。 (务必同时更改 $Db$SystemDb 。)

    $ScrUsr = $(whoami)
    Write-Host $ScrUsr

    $cmd = "GRANT SELECT ON MSysObjects TO Admin;"
    Write-Host $cmd

    Function Invoke-ADOCommand($Db, $SystemDb)
    {
    $connection = New-Object -ComObject ADODB.Connection
    $ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=$db;Jet OLEDB:System database=$SystemDb;"
    Write-Host $ConnectionString
    $connection.Open($ConnectionString)
    $discard = $connection.Execute($cmd)
    $connection.Close()
    }

    $Db = "C:\Users\hans\AccessApps\Sample.accdb"
    $SystemDb = "C:\Users\hans\AppData\Roaming\Microsoft\Access\System1.mdw"

    Invoke-ADOCommand -db $Db -SystemDb $SystemDb

    关于powershell - 授予 MSysObjects 的读取权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32843563/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com