授予 MSysObjects 的读取权限
Grant read permission for MSysObjects
我需要获取数百个 MS Access 数据库的元数据,因此我需要自动执行元数据收集过程。
我想查询 here 描述的内容,但在查询数据库之前,我需要对 MSysObjects
表进行读取访问。
我不断收到以下错误:
Record(s) cannot be read; no read permission on 'MsysObjects'.
所以我挖得更深:
我已阅读 C# 部分中有关类似问题的文章 (see here and also this one)。
我编写了一个简单的脚本,它可以很好地创建表等,但我在设置读取权限时遇到了问题。
$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,除了 "Admin".
之外,您不能 GRANT
任何其他帐户
您必须在连接字符串中包含 "System database" 的位置。
如果您不知道在哪里可以找到系统数据库,请打开 Access 并在即时 window 中检查此语句的输出。 (Ctrl+g 会立即打开window)
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
我需要获取数百个 MS Access 数据库的元数据,因此我需要自动执行元数据收集过程。
我想查询 here 描述的内容,但在查询数据库之前,我需要对 MSysObjects
表进行读取访问。
我不断收到以下错误:
Record(s) cannot be read; no read permission on 'MsysObjects'.
所以我挖得更深:
我已阅读 C# 部分中有关类似问题的文章 (see here and also this one)。
我编写了一个简单的脚本,它可以很好地创建表等,但我在设置读取权限时遇到了问题。
$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,除了 "Admin".
之外,您不能 您必须在连接字符串中包含 "System database" 的位置。
GRANT
任何其他帐户
如果您不知道在哪里可以找到系统数据库,请打开 Access 并在即时 window 中检查此语句的输出。 (Ctrl+g 会立即打开window)
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