2016-06-23 3 views
0

Точка в программе:Как выполнить скрипт powershell в C++?

Передайте имя пользователя и пароль, чтобы повысить привилегии пользователя, чтобы, если они не являются пользователями, которым разрешен доступ к защищенной папке, они все равно могут открывать и просматривать их. Имя пользователя отображается в <map>, который содержит ключ к их папке, он ищет их папку а затем передает его вместе с именем пользователя и паролем, чтобы сделать реальное повышение в следующем Powershell скрипт:

param(
    [string]$username, 
    [string]$password, 
    [string]$folder 
    ) 
    Write-Host $username $password $folder 
  
    $securePassword = ConvertTo-SecureString $password -AsPlainText -Force 
    $credential = New-Object System.Management.Automation.PSCredential $username, $securePassword 
    Start-Process T:\folders\Explorer++\Explorer++.exe \\foo\boo\fileserver\allusers\specialUsers\$folder -Credential $credential 

Я проходящее в имени пользователя, пароле и папке в этом скрипте с использованием System().

C++ кода для выполнения сценария и передать в переменных выглядит следующим образом:

String^ runCommand(string folder, string username, string password) 
    { 
     string explorerpp = "\\\\foo\\boo\\examplefolder\\Explorer++\\EXPLORER++.exe"; 
     string space = " "; 
     string quote = "\""; 
     string start = "C:\\ProgramData\\Microsoft\Windows\\Start Menu\\Programs\\System Tools\\Windows Powershell"; 
     string open = "open"; 
     string domain = "domain\\"; 
     string pwShell = "S:\\foo\\boo\\locationofscript\\pwShell.ps1 "; 
     string parentFolder = """\\\\foo\\boo\\folder\\Parent_folder\\special_users \\"""; 
     string path = parentFolder + folder; 
     String^ dir = gcnew String(path.c_str()); 
     string param = quote + domain+ username + quote + space + quote + password + quote + space + quote + folder + quote; 
     string command = "start powershell.exe" + space + pwShell + param;   
     system(command.c_str()); 
     return dir; 
    } 

Примечания: Код выглядит так, как это делает из-за огромное количество отладки, я понимаю, что я, вероятно, используя много ненужных переменных.

При запуске System() или _popen он либо открывает текстовый файл, содержащий скрипт или ошибки в командной строке.

Если бы я взял значение string command и вставил его в командную строку, я бы правильно выполнил скрипт и открыв правильную папку.

В чем проблема с C++, которая не позволяет сценарию правильно работать, когда командная строка выполняет все правильно?

BIG EDIT:

Ошибка я получаю C:\OurProj\pwShell.ps1 : File C:\OurProj\pwshell.ps1 cannot be loaded because running scripts is disabled on this system.

Я просто поговорить с ИТ ребята, и я могу запускать скрипты на этой системе, пытались сделать все местные, и если Я запускаю скрипт через powershell, он работает.

EDIT 2:

Я изменил политику выполнения, как было предложено, и это делает вернуться RemoteSigned, однако, когда код выполняется в C++ Я до сих пор говорят, что я отключил сценарии.

+3

Где 'command' фактически инициализирована? – Andrew

+0

@Andrew случайно удаляется при форматировании сообщения для переполнения стека, теперь он добавляется в правильное положение. Это прямо над вызовом 'system (command.c_str())'. – Bridger

+0

В моей системе операция по умолчанию из командной строки в файле .ps1 заключается в том, чтобы открыть ее в блокноте. (т. е. если я запустил содержимое вашей команды в командной строке, он откроет блокнот, а не запустит скрипт). Это находится в Windows 7. Вам нужно поставить 'powershell.exe' перед вашей командой. – ebyrob

ответ

0

В одной среде вы можете выполнять скрипты командной строки без знака, но в другом случае вы не можете. Для 64-битной и 32-разрядной бит каждая имеет отдельную политику выполнения для оболочки питания. Скорее всего, вы работаете в 64-битной операционной системе и создаете 32-разрядную программу на C++ (по умолчанию для визуальной студии).

Вы можете получить до 32-разрядной оболочки питания, выполнив следующие действия:

На экране Пуск, введите Windows PowerShell (x86). Запустите это как администратор.

Следующие запустить команду:

Set-ExecutionPolicy RemoteSigned 

Теперь вы должны иметь возможность запускать неподписанные локальные файлы сценарии питания из 32 разрядной среды на вашем компьютере.

В меню Пуск вы можете получить в любой среде PowerShell, убедитесь, что та же политика исполнения устанавливается для обоих с помощью команды:

Get-ExecutionPolicy 
+0

Я запустил эту команду в PowerShell в качестве администратора, и когда я получу политику выполнения, она возвращает RemoteSigned. Но я все равно получаю, что запущенные скрипты на этом компьютере отключены как риск для безопасности при попытке выполнить мой код. Я получаю разные powershell, когда я называю это через C++? – Bridger

+0

@BridgerWinter вам необходимо установить его как для 32, так и для 64-разрядных сред. Попробуйте установить внутри приложения, если ничего не работает. – ebyrob

Смежные вопросы