Powershell из SQL с помощью xp_cmdshell?
Я пытаюсь запустить команду powershell, чтобы вернуть некоторые данные в таблицу SQL, но мне не повезло, что она заработала.
В частности, я хочу получить список всех сведений о пользователях в службе профилей пользователей из SharePoint, а затем запросить LDAP через подключение к связанному серверу и получить обратно все данные о пользователях, чтобы я мог сравнить детали, поскольку считаю, что процесс синхронизации нарушен,
Я пытаюсь избежать необходимости сохранять сценарий powershell в файл.
У меня есть скрипт PowerShell, чтобы получить детали.
$site = Get-SPSite "http://site-dev.com.au";
$context = Get-SPServiceContext $site;
$profileManager = New-Object Microsoft.Office.Server.UserProfiles.UserProfileManager($context);
$Profiles = $ProfileManager.GetEnumerator();
$Userlist = New-Object System.Collections.ArrayList;
$Userlist.Clear();
foreach($up in $Profiles)
{
$prof = New-Object PSObject;
$prof | Add-Member -type NoteProperty -Name 'SID' -Value $up.get_Item("SID");
$prof | Add-Member -type NoteProperty -Name 'ADGuid' -Value $up.get_Item("ADGuid");
$prof | Add-Member -type NoteProperty -Name 'AccountName' -Value $up.get_Item("AccountName");
$prof | Add-Member -type NoteProperty -Name 'WorkEmail' -Value $up.get_Item("WorkEmail");
[void]$Userlist.Add($prof);
}
$Userlist
Это работает, и я затем объединил это с еще некоторым кодом для удаленного запуска.
$pwd = '***************************************************************' | ConvertTo-SecureString; $crd = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList "Staff\Admin-DEV", $pwd; Invoke-Command -Computername server01.staff.ad.com.au -Authentication CredSSP -Credential $crd -ScriptBlock {Add-PSSnapin Microsoft.SharePoint.PowerShell; $site = Get-SPSite "http://site-dev.com.au"; $context = Get-SPServiceContext $site; $profileManager = New-Object Microsoft.Office.Server.UserProfiles.UserProfileManager($context); $Profiles = $ProfileManager.GetEnumerator(); $Userlist = New-Object System.Collections.ArrayList; $Userlist.Clear(); foreach($up in $Profiles) { $prof = New-Object PSObject; $prof | Add-Member -type NoteProperty -Name 'SID' -Value $up.get_Item("SID"); $prof | Add-Member -type NoteProperty -Name 'ADGuid' -Value $up.get_Item("ADGuid"); $prof | Add-Member -type NoteProperty -Name 'AccountName' -Value $up.get_Item("AccountName"); $prof | Add-Member -type NoteProperty -Name 'WorkEmail' -Value $up.get_Item("WorkEmail"); [void]$Userlist.Add($prof); } $Userlist }
куда $pass
это уже зашифрованная строка
$pass = Read-Host -AsSecureString |ConvertFrom-SecureString
Но когда я беру это и пытаюсь запустить из SQL, это терпит неудачу.
DECLARE @command nvarchar(max)
SET @command = N'EXEC xp_cmdshell N''powershell -Command {'
SET @command = @command + N'$pwd = ''''**************************************************'''' | ConvertTo-SecureString; $crd = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList "Staff\Admin-DEV", $pwd; Invoke-Command -Computername server01.staff.ad.com.au -Authentication CredSSP -Credential $crd -ScriptBlock {Add-PSSnapin Microsoft.SharePoint.PowerShell; $site = Get-SPSite "http://site-dev.cqu.edu.au"; $context = Get-SPServiceContext $site; $profileManager = New-Object Microsoft.Office.Server.UserProfiles.UserProfileManager($context); $Profiles = $ProfileManager.GetEnumerator(); $Userlist = New-Object System.Collections.ArrayList; $Userlist.Clear(); foreach($up in $Profiles) { $prof = New-Object PSObject; $prof | Add-Member -type NoteProperty -Name ''''SID'''' -Value $up.get_Item("SID"); $prof | Add-Member -type NoteProperty -Name ''''ADGuid'''' -Value $up.get_Item("ADGuid"); $prof | Add-Member -type NoteProperty -Name ''''AccountName'''' -Value $up.get_Item("AccountName"); $prof | Add-Member -type NoteProperty -Name ''''WorkEmail'''' -Value $up.get_Item("WorkEmail"); [void]$Userlist.Add($prof); } $Userlist }'
SET @command = @command + '}'''
EXEC sp_executeSQL @command
Я получаю ошибку
"ConvertTo-SecureString" не распознается как внутренняя или внешняя команда "
Я не уверен, что эта ошибка связана с тем, почему она не работает, или потому, что я не экранировал некоторые символы правильно, когда проходил между SQL CMD и PowerShell.