Ответы пользователя по тегу PowerShell
  • Как в Powershell открыть URL и закрыть после этого браузер?

    @Igor_Ya
    Возьмём немного javascript. Примешаем его к PS
    $url = 'https://github.com/'
    &mshta ("javascript:new ActiveXObject('WScript.Shell').Run('explorer `"" + $url + "`",0,false');close()")

    Или так:
    $url = 'https://github.com/'
    Invoke-Expression  "$env:windir\explorer.exe $url";

    Этот код открывает страницу в браузере по умолчанию
    Вот код для открытия непосредственно в Chrome, даже если он стоит не по умолчанию
    $url = 'https://github.com'
    $path = 'HKLM:\SOFTWARE\Classes\ChromeHTML\shell\open\command'
    if(Test-Path -Path $path -ErrorAction SilentlyContinue){ # $chrome
        $chrome = ((Get-ItemProperty $path).'(Default)' -replace '%1',$url)
        $exeName='\chrome.exe'
        $index=($chrome.IndexOf($exeName)+$exeName.length+1)
        Start-Process $chrome.Substring(0,$index) $chrome.Substring($index)
    }else{
        Start-Process $url
    }

    Аккуратно закрыть сложнее. Примешаем к PS Win32. Вот код для Chrome, хотя судя по коду подойдёт для всего, даже не браузерного. (Gracefully closing Chrome.ps1):
    function Close-Window{
        param([Parameter(Mandatory=$true)][Int] $myPID,[Parameter(Mandatory=$false)][System.IntPtr][Int] $hwnd)
        $src = @'
            using System;
            using System.Runtime.InteropServices;
            public static class Win32 {
                public static uint WM_CLOSE = 0x10; 
                [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
                public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
            }
    '@ 
        Add-Type -TypeDefinition $src
        $zero = [IntPtr]::Zero
        if ($hwnd -eq 0 -or $hwnd -eq $null){
            try{ # if (get-process | where {$_.Id -eq $myPID}){} # это бесполезно, не те скорости
                $proc=Get-Process -Id $myPID
                [System.IntPtr][Int]$hwnd = (Get-Process -Id $myPID).MainWindowHandle
            }catch{}
        }
        if($hwnd){[Win32]::SendMessage($hwnd, [Win32]::WM_CLOSE, $zero, $zero) > $null}
    }
    function closeChrome($cromePath){
        $unique=@()
        if ( -not (get-process | where {$_.ProcessName -eq 'chrome'})){
        }else{
            foreach ($parentId in (Get-Process 'chrome').Id ){
                $unique+=(gwmi win32_process -Filter ('processid='+$parentId)).ParentProcessId
            }
            $PPIDs=$unique|group|where Count -eq 1
            $dopString='';foreach($PPID in $PPIDs.Name){$dopString=$dopString+' OR ParentProcessID = '+$PPID}$dopString=$dopString.Substring(4)
            $m = Get-WmiObject -Class win32_process -Filter $dopString
            $dopString='';foreach($Name in $PPIDs.Name){$dopString=$dopString+' AND NOT ParentProcessID = {0} AND NOT ProcessID = {0}' -f $Name}
            while (($p = Get-WmiObject -Class win32_process -Filter ('Name = ''chrome.exe''{0}' -f $dopString)) -eq $null) { Start-Sleep -Milliseconds 100 }
            foreach($el in $m,$p){
                foreach($ChromePrc in $el){
                    if($ChromePrc.Path -eq $cromePath){
                        if($ChromePrc.ProcessId -eq $null){Start-Sleep -Seconds 1} #Chrome начал закрываться сам Попрообоапть Break?
                        if($ChromePrc.ProcessId -ne $null){try{$hwnd=([string](Close-Window $ChromePrc.ProcessId)).Split(' ')[-1]}catch{}} # некоторые процессы уже возможно будут закрыты
                    }
                }
            }
        }
    }
    closeChrome 'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe'

    Давно, то ли сам писал, то ли глубоко переделывал чей-то не работающий код. Хром сейчас закрыть не могу для проверки. Помню, что работает. Берите как есть.
    Сам писал. Нужно было отделить закрытие процессов Chrome.exe от процессов Chrome.exe Яндекса, Хромиума и других
    Ну уже если нужно закрыть только открытую сейчас страницу, то вперёд. Рендерить страницы по названию окон. В коде перечисление уже есть. Осталось самое сложное )))
    Ответ написан
    Комментировать
  • Как активировать окно exe программы и нажать на кнопку?

    @Igor_Ya
    $wshell = New-Object -ComObject wscript.shell;
    $winName='Безымянный — Блокнот'
    $rez=$wshell.AppActivate($winName);
    $rez
    Ответ написан
    Комментировать
  • Как с помощью Powershell установить соединение PPPoE?

    @Igor_Ya
    К сожалению это выводит лишь окошечко подключения, за которым ещё окошечко и т.д. Это не подключает.
    Хотя в Windows 8 это окно выводило на подключению сразу, без новых безумных metro окон.

    $itemName = 'Ростелеком'
    $pressIt = 'Подкл&ючить/отключить'
    $sa = New-Object -ComObject Shell.Application
    $sa.NameSpace(49).Items() | foreach ({
        if($_.Name -eq $itemName){
            $_.Verbs() | foreach ({
                if ($_.name -eq $pressIt){
                    $_.DoIt()
                    break
                }
            })
        }
    })


    Похоже сам запрос "не прибегая к rasphone.exe и rasdial.exe" бессмысленен ... по крайней мере в отношении к rasdial.exe.
    Дело в том, что судя по всему, он просто является "входными воротами" в процесс программного подключения, если пользователь пожелает это сделать. И дальнейший его путь пойдёт теми же dll-ками и исполняемыми файлами, которые активируются стандартным нажатием кнопки подключить.
    Простейший скрипт Powershell
    $x='Ростелеком'
    $a='login';
    $b='password';
    $c=$env:WINDIR+'\System32\rasdial.exe';
    &$c @($x,$a,$b) 2>&1|ForEach{
             $_
    };

    выведет вам ровно те же ошибки и сообщения, которые вы видите при обычном подключении.
    То, что нужно вводить имя подключения Ростелеком к примеру - ни о чём не говорит, его можно взять из реестра.
    HKEY_USERS\'+ваш GUID+'\Software\Microsoft\RAS Phonebook
    параметр DefaultEntry - Подключение по умолчанию.
    Ну а логин и пароль - чтобы все программы массово не стали ломиться в открытые ворота.
    Важно, если не хотите увидеть крякозябры, не запускайте в среде powershell ISE.
    Запуск стандартным Powershell файла ps.1 при помощи ярлыка
    C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noexit -ExecutionPolicy Bypass -File "G:\mypath\name.ps1"
    Ответ написан
    Комментировать