![Powershell 中的登录类型转换无效](https://linux22.com/image/557617/Powershell%20%E4%B8%AD%E7%9A%84%E7%99%BB%E5%BD%95%E7%B1%BB%E5%9E%8B%E8%BD%AC%E6%8D%A2%E6%97%A0%E6%95%88.png)
我正在更新一些 powershell 代码以在 64 位机器上安装数据库表/存储过程。当我尝试分配登录类型时,我不断收到错误。这是我当前的代码。
$login = new-Object Microsoft.SqlServer.Management.SMO.Login($server, $user);
if ($server.Logins.Contains($login.Name) -eq $false)
{
$login.LoginType = [Microsoft.SqlServer.Management.SMO.LoginType]::WindowsUser;
$login.Create();
UTF-Write-Host "Login Created on $database" -type info
}
错误如下;
Error During User Operations Exception setting "LoginType": "Cannot convert value "WindowsUser" to type "Microsoft.SqlServer.Management.Smo.LoginType". Error: "Invalid cast from 'Microsoft.SqlServer.Management.Smo.LoginType' to 'Microsoft.SqlServer.Management.Smo.LoginType'.""
有人能提示我做错了什么吗?
(编辑)我包括以下内容
[void][Reflection.Assembly]::Load("Microsoft.SqlServer.SqlEnum, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91")
答案1
您是否加载了 SQLEnum 程序集?
假设您使用的是 SQL Server 2008 或 2008 R2:
add-type -AssemblyName "Microsoft.SqlServer.SqlEnum, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"
答案2
不确定你是如何加载你的程序集的,但这对我来说有用:
[Reflection.Assembly]::LoadFile("C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.ConnectionInfo.dll")
[Reflection.Assembly]::LoadFile("C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.Smo.dll")
# Then your code.
我在 64 位 PowerShell v2 实例上对此进行了测试。
我怀疑您缺少这个程序集:Microsoft.SqlServer.SqlEnum.dll
。
这是LoginType
声明枚举的地方。
在我的 64 位机器上,它位于:
C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\
32 位程序集位于 64 位机器中:
C:\Program Files (x86)\Microsoft SQL Server\100\SDK\Assemblies
在此计算机上我安装了以下 SQL Server 2008 R2 功能包项:
- SQL Server 2008 R2 本机客户端 (x64)
- SQL Server 2008 R2 管理对象 (x86)
- SQL Server 2008 R2 管理对象 (x64)
- SQL Server 系统 CLR 类型 (x86)
- SQL Server 系统 CLR 类型 (x64)
您可以在这里找到这些内容:
我也在 VS 2010 中用 C# 构建了相同的代码,如果Microsoft.SqlServer.SqlEnum
没有引用程序集,那么就会出现编译错误。