none
В каком месте нужно указывать переменную RRS feed

  • Вопрос

  • Добрый день, есть вот такой скрипт:

    #robot chappy ver. 1.0
    Add-Type -AssemblyName System.Windows.Forms 
    $MainForm = New-Object System.Windows.Forms.Form
    $MainForm.Width = 250
    $MainForm.Height = 380
    $MainForm.FormBorderStyle = "Fixed3D"
    $MainForm.MinimizeBox = $false
    $MainForm.MaximizeBox = $false
    $MainForm.Text = "AM Chappy"
    $MainForm.StartPosition = "CenterScreen"
    $FormLabel = New-Object System.Windows.Forms.Label
    $FormLabel.Location = New-Object System.Drawing.Point (90,10)
    $FormLabel.Width = 70
    $FormLabel.Text = "AM-Chappy"
    $MainForm.Controls.Add($FormLabel)
    
    <#
    FORM ELEMENTS
    #>
    #lang template
    $LangLabel = New-Object System.Windows.Forms.Label
    $LangLabel.Location = New-Object System.Drawing.Point (5,40)
    $LangLabel.Width = 60
    $LangLabel.Text = "Language:"
    $LangLabelBox = New-Object System.Windows.Forms.ComboBox
    $LangLabelBox.Location = New-Object System.Drawing.Point(90,40)
    $LangLabelBox.Width = 100
    $LangLabelBox.DataSource = @('EN','DE','FR','NL')
    $LangLabelBox.DropDownStyle = [System.Windows.Forms.ComboBoxStyle]::DropDownList
    $MainForm.Controls.Add($LangLabel)
    $MainForm.Controls.Add($LangLabelBox)
    
    #count
    $CountLabel = New-Object System.Windows.Forms.Label
    $CountLabel.Location = New-Object System.Drawing.Point (5,70)
    $CountLabel.Width = 60
    $CountLabel.Text = "Count:"
    $MainForm.Controls.Add($CountLabel)
    $CountBox = New-Object System.Windows.Forms.ComboBox
    $CountBox.Location = New-Object System.Drawing.Point(90,70)
    $CountBox.Width = 100
    $CountBox.DataSource = @('1','2','3','4','5','6','7','8','9','10')
    $CountBox.DropDownStyle = [System.Windows.Forms.ComboBoxStyle]::DropDownList
    
    
    #pool resource
    $PoolLabel = New-Object System.Windows.Forms.Label
    $PoolLabel.Location = New-Object System.Drawing.Point (5,100)
    $PoolLabel.Width = 82
    $PoolLabel.Text = "Resource Pool:"
    $MainForm.Controls.Add($PoolLabel)
    $PoolBox = New-Object System.Windows.Forms.ComboBox
    $PoolBox.Location = New-Object System.Drawing.Point(90,100)
    $PoolBox.Width = 100
    $PoolBox.DataSource = @('WORKS','WIN_WORKS','TECH')
    $PoolBox.DropDownStyle = [System.Windows.Forms.ComboBoxStyle]::DropDownList
    
    #ip address proxy textbox and label
    $ProxyAddressLabel = New-Object System.Windows.Forms.Label
    $ProxyAddressLabel.Location = New-Object System.Drawing.Point (5,150)
    $ProxyAddressLabel.Width = 65
    $ProxyAddressLabel.Text = "Proxy List:"
    $MainForm.Controls.Add($ProxyAddressLabel)
    $ProxyAddressTextbox = New-Object System.Windows.Forms.TextBox
    $ProxyAddressTextbox.Location = New-Object System.Drawing.Point(80,150)
    $ProxyAddressTextbox.Width = 120
    
    #ip address proxy textbox and label
    $HostnameLabex = New-Object System.Windows.Forms.Label
    $HostnameLabex.Location = New-Object System.Drawing.Point (5,270)
    $HostnameLabex.Width = 65
    $HostnameLabex.Text = "Hostname:"
    $MainForm.Controls.Add($HostnameLabex)
    $HostNameTextbox = New-Object System.Windows.Forms.TextBox
    $HostNameTextbox.Location = New-Object System.Drawing.Point(80,270)
    $HostNameTextbox.Width = 120
    
    #button create
    $ButtonCreate = New-Object System.Windows.Forms.Button
    $ButtonCreate.Location = New-Object System.Drawing.Size(100,300)
    $ButtonCreate.Text = "Create VM"
    $ButtonCreate.Size = New-Object System.Drawing.Size(70,20)
    
    
    $ButtonCreate.Add_Click({
    if ($LangLabelBox.SelectedItem = "EN") {
    
    #Generate random string for password
    
    
    $Country = 010
    & 'C:\Program Files (x86)\VMware\Infrastructure\vSphere PowerCLI\Scripts\Initialize-PowerCLIEnvironment.ps1'
    Connect-VIServer -Server 192.168.250.123 -User root -Password 
    $Spec=Get-OSCustomizationSpec -Name $LangLabelBox.SelectedItem
    if ($Spec -ne $null)
    {
    Set-OSCustomizationSpec -Spec $LangLabelBox.SelectedItem -Server 192.168.250.123 `
    -GuiRunOnce "cmd /c powershell.exe -command `"$($OVPNvfg -join ',') | Out-File C:\text.txt",
    "wmic computersystem where name=""%COMPUTERNAME%"" call rename name=""$($HostNameTextBox.Text)""",
    "netsh advfirewall set allprofiles state off",
    "net user User $UserPassword /ADD",
    "net localgroup ""Remote Desktop Users"" User /add" -LicenseMode NotSpecified -AdminPassword $AdministratorPassword `
    -TimeZone $Country -AutoLogonCount 1 -Workgroup WORKGROUP
    }
    
    New-VM -VMHost 192.168.200.13 -ResourcePool $PoolBox.SelectedItem -Datastore "iSCSIDataStore" -Name $HostNameTextbox.Text -Template "ENWin7ProN" -OSCustomizationSpec $LangLabelBox.SelectedItem
    Start-VM -VM $HostNameTextbox.Text
    
    Start-Sleep -Seconds 30
    
    $Time = 0
    do {
        $UpTime = Get-Stat -Entity $HostNameTextbox.Text -Stat sys.uptime.latest -Realtime -MaxSamples 1
        $Time = $UpTime.Value
        $Time
        }
        until ($Time -gt 300)
    
    Get-VM -Name $HostNameTextbox.Text | %{$IPAddress = $_.Guest.IPAddress[0]}
    
    
    [System.Windows.Forms.MessageBox]::Show("Create VM successfully", "Chappy INFO", 0)
    $MainForm.Close()
    }
    })
    
    $MainForm.Controls.Add($CountBox)
    $MainForm.Controls.Add($PoolBox)
    $MainForm.Controls.Add($ProxyAddressTextbox)
    $MainForm.Controls.Add($ButtonCreate)
    $MainForm.Controls.Add($HostNameTextbox)
    $MainForm.ShowDialog()

    И есть переменная:

    $OVPNvfg =
    "'client'",
    "'dev tun'",
    "'proto udp'",
    "'remote $($ProxyAddressTextbox.Text) 1144'",
    "'resolv-retry infinite'",
    "'nobind'",
    "'persist-key'",
    "'persist-tun'",
    "'ca ca.crt'",
    "'cert cli1.crt'",
    "'key cli1.key'",
    "'tls-client'",
    "'tls-auth ta.key 1'",
    "'comp-lzo'",
    "'verb 3'"

    Не могу разобраться где ее вставить, чтобы строка 

    -GuiRunOnce "cmd /c powershell.exe -command `"$($OVPNvfg -join ',') | Out-File C:\text.txt"

    корректно работала. Если я вставляю в место где я создаю переменные, то в нее есстественное не попадает введенное значение в поле $ProxyAddressTextbox.Text, а если указываю в  действии кнопки, то файл вообще не создается


    С уважением, Спицкий Никита


Ответы

  • В блоке $ButtonCreate.Add_Click({:

    $ButtonCreate.Add_Click({
    if ($LangLabelBox.SelectedItem = "EN") {
    
    $OVPNvfg = @"
    client`r`n
    dev tun`r`n
    proto udp`r`n
    remote $($ProxyAddressTextbox.Text) 1144`r`n
    resolv-retry infinite`r`n
    nobind`r`n
    persist-key`r`n
    persist-tun`r`n
    ca ca.crt`r`n
    cert cli1.crt`r`n
    key cli1.key`r`n
    tls-client`r`n
    tls-auth ta.key 1`r`n
    comp-lzo`r`n
    verb 3`r`n
    "@ 

    Команда для выполнения:

    powershell -Command "&{'$OVPNvfg'| Out-File C:\text.txt}"

    Отвечающий
  • Что такое "CSM такая строчка появилась" ?

    Т.к. команда для запуска правильная, скрипт преобразуется в формат Base64,чтоб исключить экранирования и прочее и должен выполниться на удаленной машине. Для теста в GuiOnce файл создается если использовать:

    cmd /c 1 > C:\test.txt или powershell -command "1 > C:\test.txt"

    Отвечающий

Все ответы

  • В блоке $ButtonCreate.Add_Click({:

    $ButtonCreate.Add_Click({
    if ($LangLabelBox.SelectedItem = "EN") {
    
    $OVPNvfg = @"
    client`r`n
    dev tun`r`n
    proto udp`r`n
    remote $($ProxyAddressTextbox.Text) 1144`r`n
    resolv-retry infinite`r`n
    nobind`r`n
    persist-key`r`n
    persist-tun`r`n
    ca ca.crt`r`n
    cert cli1.crt`r`n
    key cli1.key`r`n
    tls-client`r`n
    tls-auth ta.key 1`r`n
    comp-lzo`r`n
    verb 3`r`n
    "@ 

    Команда для выполнения:

    powershell -Command "&{'$OVPNvfg'| Out-File C:\text.txt}"

    Отвечающий
  • К сожалению файл не создался


    С уважением, Спицкий Никита

  • Может кто подаст еще какие-нибудь идеи?

    С уважением, Спицкий Никита

  • Лучше вместо пустых слов, которые только засоряют, приводите логи выполнения и ошибок.  Можно попробовать использовать base64:

    $command = " '$OVPNvfg'| Out-File C:\test.txt "
    $bytes = [System.Text.Encoding]::Unicode.GetBytes($command)
    $encodedCommand = [Convert]::ToBase64String($bytes)
    -GuiRunOnce "powershell.exe -encodedCommand $encodedCommand"

    Отвечающий
  • вы из под админа запускаете? уак включен? есть право создания файлов в корне диска?

    а чем вам идея посмотреть и показать таки логи ошибок вам не нравится?

    тот же самый случай когда при включенном уаке пропадает право писать в корень - явно пишет красным по синему:

    PS C:\> 'hello'|Out-File C:\test.txt
    Out-File : Access to the path 'C:\test.txt' is denied.
    At line:1 char:17
    + 'hello'|Out-File <<<<  C:\test.txt
        + CategoryInfo          : OpenError: (:) [Out-File], UnauthorizedAccessException
        + FullyQualifiedErrorId : FileOpenFailure,Microsoft.PowerShell.Commands.OutFileCommand

  • Файл создается, если я не работаю с переменой в блоке add.click{()}. Т.е. если я указываю эту переменную выше этого блока, то все работает отлично. Ошибок никаких нет. У меня есть подозрение, что какая-то проблема с типом данных. 

    С уважением, Спицкий Никита

  • Извините, не увидел сообщение, сейчас попробую

    С уважением, Спицкий Никита

  • В CSM такая строчка появилась

    powershell.exe -EncodedCommand IAAnAGMAbABpAGUAbgB0AA0ACgANAAoAZABlAHYAIAB0AHUAbgANAAoADQAKAHAAcgBvAHQAbwAgAHUAZABwAA0ACgANAAoAcgBlAG0AbwB0AGUAIAAxADkAMgAuADEANgA4AC4AMgAyADIALgAyADIAMgAyACAAMQAxADQANAANAAoADQAKAHIAZQBzAG8AbAB2AC0AcgBlAHQAcgB5ACAAaQBuAGYAaQBuAGkAdABlAA0ACgANAAoAbgBvAGIAaQBuAGQADQAKAA0ACgBwAGUAcgBzAGkAcwB0AC0AawBlAHkADQAKAA0ACgBwAGUAcgBzAGkAcwB0AC0AdAB1AG4ADQAKAA0ACgBjAGEAIABjAGEALgBjAHIAdAANAAoADQAKAGMAZQByAHQAIABjAGwAaQAxAC4AYwByAHQADQAKAA0ACgBrAGUAeQAgAGMAbABpADEALgBrAGUAeQANAAoADQAKAHQAbABzAC0AYwBsAGkAZQBuAHQADQAKAA0ACgB0AGwAcwAtAGEAdQB0AGgAIAB0AGEALgBrAGUAeQAgADEADQAKAA0ACgBjAG8AbQBwAC0AbAB6AG8ADQAKAA0ACgB2AGUAcgBiACAAMwANAAoAJwB8ACAATwB1AHQALQBGAGkAbABlACAAQwA6AFwAdABlAHMAdAAuAHQAeABa0ACAA


    С уважением, Спицкий Никита

  • Base64 → UTF-8
  • Извините, я не совсем понял, что вы имеете ввиду

    С уважением, Спицкий Никита

  • с кодировкой проблема... вчера начал читать, но щас времени нет доразобраться..

    вроде вот на чтото из этого похоже -

    https://blogs.msdn.microsoft.com/ddietric/2010/11/08/decoding-standard-output-and-standard-error-when-redirecting-to-a-gui-application/

    P.S. стучите в бубен, призывайте казуна :-)

  • Что такое "CSM такая строчка появилась" ?

    Т.к. команда для запуска правильная, скрипт преобразуется в формат Base64,чтоб исключить экранирования и прочее и должен выполниться на удаленной машине. Для теста в GuiOnce файл создается если использовать:

    cmd /c 1 > C:\test.txt или powershell -command "1 > C:\test.txt"

    Отвечающий