Я написал пару приложений;один, который выдает скрипты powershell клиентам (серверу), и тот, который выполняет переданные ему скрипты powershell (клиенту).
Я добавил функции для определения, требует ли конкретный сценарий повышения прав.Если сценарию требуется повышение прав, серверное приложение запрашивает у пользователя учетные данные.Пароль преобразуется в безопасную строку и сохраняется в базе данных SQL, а также имя пользователя и сценарий.
Клиентское приложение захватывает сценарий и, если требуется повышение прав, захватывает имя пользователя и защищенную строку, а затем пытается создать из него объект учетных данных.
Функциональность работает нормально для не повышенных правсценарии, но повышенные сценарии не работают.Это не ошибка или выдача исключения (наконец), но сценарии не выполняются.
Первая часть этого процесса считывает данные из SQL в таблицу данных, а затем я перебираю строки этой таблицы данных.Когда у меня есть строка, содержащая скрипт, который нужно запустить, я создаю скрипт.
Вот как я собираю и выполняю PowerShell в VB ...
If this_routine_elevation_required = 1 Then
Dim scriptbody As String = row("scriptbody").ToString
Dim elevated_user_un As String = row("elevated_user").ToString
Dim elevated_user_ss As String = row("securestring").ToString
credential_script = "$securepassword = '" & elevated_user_ss & "' | ConvertTo-SecureString; $username='" & elevated_user_un & "';$credential = New-Object System.Management.Automation.PsCredential($username, $securepassword)"
action_response = RunPowershellScript(credential_script & "; " & scriptbody)
End If
и вот функция, которая выполняет powershell (используя 'Imports System.Management.Automation) ...
Private Function RunPowershellScript(ByVal scriptText As String) As String
' create Powershell runspace
Dim MyRunSpace As Runspace = RunspaceFactory.CreateRunspace()
MyRunSpace.Open()
Dim MyPipeline As Pipeline = MyRunSpace.CreatePipeline()
MyPipeline.Commands.AddScript(scriptText)
Dim results As Collection(Of PSObject) = MyPipeline.Invoke()
MyRunSpace.Close()
Dim MyStringBuilder As New StringBuilder()
For Each obj As PSObject In results
MyStringBuilder.AppendLine(obj.ToString())
Next
Return MyStringBuilder.ToString()
End Function
Я выбросил окно сообщения скрипта перед его передачей в функцию RunPowershellScript, поэтому ямог убедиться, что ничто не было искажено или гарантировать, что я не делал ничего глупого (я манипулировал безопасной строкой для целей этого изображения) ...
Пример, приведенный здесь, является просто тестом, чтобы выяснить, может ли исполнитель остановить службу W32Time, что обычно требует повышения прав.Это не работает.Я получаю пустой ответ от функции RunPowershellScript, и служба продолжает работать.
Мне пришло в голову, что я получаю строку безопасности из базы данных, а затем преобразовываю эту строку безопасности в строку безопасности, так что, возможно, она не заканчивается правильным действительным паролем в $ учетных данных, но, насколько я понимаю, янеобходимо предоставить защищенную строку для параметра пароля PsCredential, а без -ConvertTo-SecureString он будет считать пароль просто строкой.Я попытался это, и это бросило исключение о пароле, равном нулю.
Может кто-нибудь помочь направить меня в правильном направлении?
Большое спасибо заранее.