我正在努力处理运行 SQL Server Reporting Services 的远程服务器。我的 Reporting Services 使用单独的域帐户运行,并且我已经为它们设置了 SPN ( HTTP/<Machine> <domain>\<user>)。据我所知,这有效地禁用了 PowerShell 远程处理,因为 WinRM 应该使用的 SPN 指向 Reporting Services 使用的域帐户。
我在运行 eg 时没有问题Get-Service -ComputerName <Machine>,但是如果我尝试Get-CimInstance Win32_Service -ComputerName <machine>或Enter-PsSession <machine>遇到类似的错误:
Get-CimInstance :WinRM 无法处理请求。使用 Kerberos 身份验证时出现错误代码 0x80090322 的以下错误:发生未知安全错误。可能的原因有:
-指定的用户名或密码无效。
-Kerberos 在未指定身份验证方法和用户名时使用。
-Kerberos 接受域用户名,但不接受本地用户名。
- 远程计算机名称和端口的服务主体名称 (SPN) 不存在。
- 客户端和远程计算机在不同的域中,两个域之间不存在信任。检查上述问题后,请尝试以下操作: -
检查事件查看器中是否存在与身份验证相关的事件。
- 更改认证方式;将目标计算机添加到 WinRM TrustedHosts 配置设置或使用 HTTPS 传输。请注意,TrustedHosts 列表中的计算机可能未经过身份验证。
- 有关 WinRM 配置的更多信息,请运行以下命令:winrm help config。在 line:1 char:1 + Get-CimInstance win32_service -ComputerName …
我正在尝试读取 winforms C# 应用程序中表和列的扩展属性。我正在使用 SQL Server SMO 来执行此操作。当我执行应用程序时,它看不到扩展属性,但是当我使用 PowerShell 读取扩展属性时,它确实看到了扩展属性。
C# 代码:
var x = col.ExtendedProperties.Count;
var NPI = col.ExtendedProperties["NPI"].Value;
bool npi = bool.Parse(NPI.ToString());
Run Code Online (Sandbox Code Playgroud)
PowerShell 代码:
Add-Type -AssemblyName "Microsoft.SqlServer.Smo, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"
$server = New-Object Microsoft.SqlServer.Management.Smo.Server $env:COMPUTERNAME
$server.Databases["<db name>"].Tables["<table name>"].Columns["<column name>"].ExtendedProperties | Select Name, Value, State
Run Code Online (Sandbox Code Playgroud)
我已经检查过,Visual Studio 和 PowerShell 都使用相同版本的 SMO (11.0.0.0)。当我执行 C# 代码时 col.ExtendedProperties.Count = 0,但是当我执行 PowerShell 代码时,我得到:
Name Value State
---- ----- -----
NPI False Existing
Run Code Online (Sandbox Code Playgroud)
有没有人对为什么会发生这种情况有任何想法?
在 C# 代码中,我使用以下方法在表上打开了一个 DataReader:
sourceServer.ConnectionContext.ExecuteReader(<select command>)
Run Code Online (Sandbox Code Playgroud)
从表中检索数据。然后我使用 DataReader 进入一个 …
我想我刚刚找到了 SQL Server SMO 和 PowerShell 最酷的东西。我被要求编写一个脚本来查找 SQL Server 实例中每个对象的所有者。我在 Technet/MSDN SQL Server 库上找到了一个脚本,但认为使用 PowerShell 获取它会容易得多,并且能够一次访问网络上的所有实例。
在玩的过程中,我在 Database 类中遇到了这个方法:Discover()
因此,如果您使用此代码:
#Load SMO
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.Smo') | Out-Null
$srv = New-Object 'Microsoft.SqlServer.Management.Smo.Server' "your instance name"
$db = $srv.Databases
$db.Discover()
Run Code Online (Sandbox Code Playgroud)
当你运行最后一行时,如果你连接到一个有很多数据库的实例,你会看到你的控制台开始滚动文本,就像它在药物上一样。
好吧,我去做了 $db | gm ,它几乎向您展示了 SMO 对象中可用的每个 TypeName。
现在我的问题。我可以执行$db.Discover() | Select Name, Owner,它将开始吐出带有名称和所有者值的所有内容。
我怎样才能获得返回对象的对象类型(比如它是触发器、模式、表等)?到目前为止,我似乎无法弄清楚。
编辑
到目前为止,我发现它似乎只能在数据库级别“发现”事物。显然,我在控制台缓存中的某个地方设置 $db了类似$db = ($srv.Databases).Item("aDatabase"),因为这是您可以调用该方法的唯一方法。尽管如此,仍在寻找一种方法来提取对象名称、类型和所有者。
我正在使用 Powershell 脚本来更新故障转移集群中命名 SQL 实例上的服务帐户。我正在尝试使用 SMO 和 WMI 来更新它,以便我可以更新主动节点上的服务帐户并将其填充到其他被动节点(如果我在配置工具中手动更新会发生这种情况)。我正在尝试在本地机器上执行脚本但更新远程服务器。根据我的 Google 搜索,我看到的错误似乎与安全相关,如果我在远程计算机上以提升的权限(以管理员身份)本地运行脚本,则该错误会成功。
编码:
[reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.SqlWmiManagement") | Out-Null
$mc=New-Object -TypeName Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer "SQLHOST01"
$srvcs= $mc.Services | Where {$_.name -like "*INSTANCE01*"} | Where {$_.Type -like "Sql*"}
$srvcs | ft name,servicestate,serviceaccount
foreach ($s in $srvcs){
$s.SetServiceAccount("FOO\Bar","strongpass")
}
Run Code Online (Sandbox Code Playgroud)
错误:
Exception calling "SetServiceAccount" with "2" argument(s): "Set service account failed. "
At line:11 char:5
+ $s.SetServiceAccount("FOO\Bar","strongpass")
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : FailedOperationException
Run Code Online (Sandbox Code Playgroud)
使用:Windows 2008 R2(远程)SQL 2008 R2(远程)Windows 7 with SQL 2012 …
我们的 OLTP 日志系统的其中一个表中的 ID 即将用完。我的工作是找到一种方法来“归档”完整表和所有引用表中的现有行数据,以便我们可以继续将新数据记录到表中。
我们在一个表中归档数据的最快方法是简单地重命名目标表和所有依赖对象——联结表、索引、约束。它速度很快,并且可以保持数据完整。为了完成这项工作,我们必须使用旧名称创建所有对象的新的空副本。如果我们在一个事务中完成所有这些操作,插入新数据的存储过程不会因为缺少表而失败。
我已经整理了一个 PowerShell 脚本来生成一个 T-SQL 脚本来执行存档操作。
该脚本没有生成应有的重命名语句,我不明白为什么。
该脚本加载 SMO,设置目标对象的名称,并设置到服务器的仅捕获连接 - 这样我就可以捕获重命名命令以供稍后检查:
Add-Type -AssemblyName "Microsoft.SqlServer.Smo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91";
$ServerName = 'CLOUDCORP\LOGGING'
$DatabaseName = 'Logging'
$TableName = 'tbDataRequests'
$TableSchemaName = 'Logging'
$Server = New-Object Microsoft.SqlServer.Management.Smo.Server $ServerName
$Server.ConnectionContext.SqlExecutionModes = [Microsoft.SqlServer.Management.Common.SqlExecutionModes]::CaptureSql
Run Code Online (Sandbox Code Playgroud)
接下来,它创建一个将通过重命名存档的对象数组。目标表本身、所有引用表以及这些表的所有键和所有索引都将被归档:
$Database = $Server.Databases[$DatabaseName]
$Table = @($Database.Tables[$TableName, $TableSchemaName])
$ReferencingTables = $Database.Tables.ForeignKeys |
? { $_.ReferencedTable -eq $TableName -and $_.ReferencedTableSchema -eq $TableSchemaName } |
% { $_.Parent } | Sort ID | Get-Unique
$TablesToArchive = …Run Code Online (Sandbox Code Playgroud) 测试SQL服务器作业在执行Powershell脚本时挂起。它确实使用我的登录名和Powershell窗口工作,但不使用Agent帐户和工作。该SQL Agent用户具有读/写/执行权限与PowerShell脚本的目录。
例子:
Run as: SQL Server Agent Service Account
powershell.exe -file \\Server02\test2\Test.ps1
Run Code Online (Sandbox Code Playgroud)
代理帐户也已获得访问权限。
这个测试文件目前做了一些非常基本的事情:显示一个字符串。
当它运行时,它不会显示错误消息,因为它只是不响应。您知道发生了什么,或者缺少哪些安全设置吗?
我有一个 SQL Server 代理作业,它在一个步骤中调用 PowerShell 脚本。我想将 SQL 服务器名称和当前作业 ID 传递给我的脚本。
有了工作 ID,我没有问题。但是使用服务器名称...
我的 PowerShell 调用如下所示:
.\StopServices.ps1 -ServerName $(ESCAPE_DQUOTE(A-SVR)) -JobId $(ESCAPE_DQUOTE(JOBID))
Run Code Online (Sandbox Code Playgroud)
作业 ID 工作正常,但服务器名称为空。
如何将服务器名称传递给我的 PowerShell 脚本?
我正在尝试sp_AskBrent使用 PowerShell运行Invoke-SQLCmd并在变量中捕获其输出:
$query = "EXEC SAIDBA.monitoring.sp_AskBrent @Seconds=10;"
$check = Invoke-Sqlcmd -ServerInstance $ServerInstance -Query $query
-ErrorAction Stop -ConnectionTimeout 3
Run Code Online (Sandbox Code Playgroud)
使用ExpertMode = 0运行时,没问题。
但是当使用ExpertMode = 1运行时,我们注意到三件事:
$check 一片空白 它以以下错误结束:
Invoke-Sqlcmd:SQL PowerShell 中不允许出现重复的列名。要重复列,请使用 Column_Name AS New_Name 格式的重复列的列别名。
在行:1 字符:18
- $check = Invoke-Sqlcmd -ServerInstance $ServerInstance -Query $query -Er ...
- CategoryInfo: SyntaxError: (:) [Invoke-Sqlcmd], SqlPowerShellSqlExecutionException
- FullQualifiedErrorId : DuplicateColumnNameErrorMessage, Microsoft.SqlServer.Management.PowerShell.GetScriptCommand
我认为有一种解决方法可以提供sp_AskBrent将ExpertMode数据存储到表中并随后从这些表中选择的参数,但我想确保无法在 PowerShell 中立即恢复所有内容。
我正在尝试在 SQL 代理作业 (SQL Server 2016) 中设置 PowerShell 脚本。我正在使用第三方模块 DBATOOLS.psd1,它似乎是我遇到语法错误的地方。目前我的 SQL 作业有一行代码失败:
Import-Module e:\dbatools-master\dbatools-master\dbatools.psd1
Run Code Online (Sandbox Code Playgroud)
为什么作业失败并出现以下错误?当我通过 PowerShell ISE 运行它时,此命令工作正常。
Error Message: Unable to start execution of step 1 (reason: line(5): Syntax error). The step failed.
Run Code Online (Sandbox Code Playgroud) sql-server powershell sql-server-agent sql-server-2016 dbatools
当我从Glenn Berry运行以下查询时
-- Hardware information from SQL Server 2016 (Query 18) (Hardware Info)
SELECT cpu_count AS [Logical CPU Count], scheduler_count, hyperthread_ratio AS [Hyperthread Ratio],
cpu_count/hyperthread_ratio AS [Physical CPU Count],
physical_memory_kb/1024 AS [Physical Memory (MB)], committed_kb/1024 AS [Committed Memory (MB)],
committed_target_kb/1024 AS [Committed Target Memory (MB)],
max_workers_count AS [Max Workers Count], affinity_type_desc AS [Affinity Type],
sqlserver_start_time AS [SQL Server Start Time], virtual_machine_type_desc AS [Virtual Machine Type],
softnuma_configuration_desc AS [Soft NUMA Configuration],
sql_memory_model_desc -- New in SQL Server 2016 SP1 …Run Code Online (Sandbox Code Playgroud) powershell ×10
sql-server ×9
smo ×3
c# ×1
clustering ×1
cpu ×1
dbatools ×1
sp-askbrent ×1
sqlcmd ×1
ssrs ×1