Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Windows PowerShell 1.x/2.x/CTP

Автор: leoadm
Дата сообщения: 01.08.2011 19:57
lavren
Спасибо. я опечатался сорри, VBS конечно же имел в виду...
Автор: ComradG
Дата сообщения: 01.08.2011 22:00
leoadm
а чего пробовать-то? вызвать vbs-код из posh'а что ли? дык это песня стара как мир:
Код: $sc = New-Object -com MSScriptControl.ScriptControl
$sc.language="VBScript"
$sc.addcode("Set strMsg = `"Hello from VBScript!`"
MsgBox strMsg, 0, `"VBScript`"")
Автор: leoadm
Дата сообщения: 01.08.2011 22:20
ComradG
Круг выполняемых задач конечно шире, чем MsgBox, но все равно спасибо... Скачал книжку - буду вникать
Автор: ComradG
Дата сообщения: 01.08.2011 23:20
leoadm
дядь, тебе пример нужен был как вызвать VBScript из PoSh'а или нет? если ты посмотришь чуточку внимательней то обнаружишь еще один мой пост о PoSh'е v1.0 в котором показывается как создать точку восстановления системы, используя при этом VBScript.
Код: $objCOM = New-Object -com MSScriptControl.ScriptControl
$objCOM.Language = "VBScript"
$objCOM.AddCode('strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\default")
Set objItem = objWMIService.Get("SystemRestore")
errResult = objItem.CreateRestorePoint _
("Системная контрольная точка", 7, 100)')
Автор: leoadm
Дата сообщения: 02.08.2011 08:32
ComradG
Да, пример оказался полезен, не переживай ты так, спасибо.
Автор: ComradG
Дата сообщения: 02.08.2011 15:19
leoadm
рекомендую к прочтению еще пару документов для более глубоко понимания сабжа:Спецификация WinHost сценариев
от M$
и ECMAScript обе на английском, но довольно вменяемые и без литья воды.
Автор: qik
Дата сообщения: 18.08.2011 12:01
Как сделать окно консоли активным?
Так как start-process не имеет опции запуска в фоновом режиме, возникла необходимость сразу после запуска возвращать фокус на окно консоли.
Автор: ComradG
Дата сообщения: 19.08.2011 19:42

Цитата:
Как сделать окно консоли активным?
в скрипте или в текущей сессии?
Автор: qik
Дата сообщения: 19.08.2011 20:39
ComradG
Если честно не совсем вас понял.
Вот пример:
Write-host "Загружаю Блокнот"
Start-process notepad.exe
# в этот момент открывается блокнот и перекрывает окно консоли
Тут нужна инструкция которая сделает активным консоль, то есть фокус перейдет на консоль (как будто я кликну на нее мышкой)
Автор: ComradG
Дата сообщения: 19.08.2011 21:11

Цитата:
Если честно не совсем вас понял.
в хосте набиваешь команды или запускаешь накатанный сценарий? если последнее, то пробовал:
Код: start-process notepad.exe -wait
Автор: qik
Дата сообщения: 19.08.2011 21:44
ComradG
Запускаю сценарий.
Wait пробовал. Дело в том что моя вызываемая програма открывает кучу диалоговоых окон где требуется нажимать кнопки, короче говоря там фокус теряется точно и до конца.
.MainWindowHandle буду пробовать, спасибо.
Автор: qik
Дата сообщения: 22.08.2011 13:22
ComradG
Спасибо за вектор.
В итоге раскопал скрипт

Код:
Add-Type @"
using System;
using System.Runtime.InteropServices;
public class Tricks {
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetForegroundWindow(IntPtr hWnd);
}
"@
sleep -sec 2
$h = (Get-Process firefox).MainWindowHandle
[void] [Tricks]::SetForegroundWindow($h)
sleep -sec 2
$h = (Get-Process -id $pid).MainWindowHandle
[void] [Tricks]::SetForegroundWindow($h)
Автор: ComradG
Дата сообщения: 22.08.2011 16:18
qik

Цитата:
3. дождаться последнего окна и отловить нажатие на ОК
здесь более вопрос по WinAPI: берешь Window Detective или Spy++ от M$, ищешь хэндл кнопки, - ну а дальше пишешь в скрипте обработчик для программного нажатия кнопки.
Автор: qik
Дата сообщения: 23.08.2011 07:59
ComradG
Спасибо, буду разбираться.

Следующий вопрос
Есть домен в домене есть пользователи (с ограниченными правами на запись в c:/windows) и админы.
Я хочу запускать скрипты у пользователей с админскими правами, как я понимаю нужно использовать Credentials, но проблема в том, что провайдер FileSystem не работает.
Как мне имея админскую учетку (не перелогиневаясь в ОС) иметь возможность писать\удалять файлы в критических областях типа c:/windows ?
Автор: qik
Дата сообщения: 23.08.2011 10:11
ComradG
И если можно поподробнее про Spy++, никаких хендлов кнопок я там не нашел. Только идентификаторы которые меняются от раза в раз.
Автор: ComradG
Дата сообщения: 23.08.2011 15:38
qik
прошу прощения, я малость напутал: не хэндлы, а заголовки контрола, - в твоем случае батона "ОК".

Цитата:
что провайдер FileSystem не работает.
???

Цитата:
Как мне имея админскую учетку...
с админской учеткой вообще-то это можно делать, если не были изменены права доступа. может ты имел в виду гостя, то тогда примерно так:
Код: runas /noprofile /user:DOMAIN\USER /env powershell.exe
Автор: qik
Дата сообщения: 23.08.2011 16:24
ComradG
Нашел код который идеально подошел для моих целей


Код: using System;
using System.Runtime.InteropServices;
class TestProgram
{
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string className, string windowName);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
const int WM_LBUTTONDOWN = 0x0201;
const int WM_LBUTTONUP = 0x0202;
static void Main()
{
// находим окно калькулятора, зная window class ("SciCalc")
IntPtr calcWnd = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "SciCalc", null);
// находим кнопку по имени окна ("1") и имени класса ("Button")
IntPtr button1 = FindWindowEx(calcWnd, IntPtr.Zero, "Button", "1");
// если нашли
if(button1 != IntPtr.Zero)
{
// посылаем нажатие кнопки мыши, последний параметр
// содержит координаты мыши (скопировано из Spy++)
SendMessage(button1, WM_LBUTTONDOWN, 1, 0x150018);
SendMessage(button1, WM_LBUTTONUP, 0, 0x150018);
}
}
}
Автор: ComradG
Дата сообщения: 23.08.2011 16:52
qik
CSharpCodeProvider тебе ни о чем не говорит? от себя могу добавить пример:
Код: #скрыть окно консоли при запуске сценария
function HideConsoleWindow {
$cscp = New-Object Microsoft.CSharp.CSharpCodeProvider
$cpar = New-Object CodeDom.Compiler.CompilerParameters

$hideWindow = 0x0080

$code = 'using System;
using System.Runtime.InteropServices;

namespace MyLibrary
{
public class Window
{
[DllImport("user32.dll")]
public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter,
int x, int y, int cx, int cy, uint uFlags);
}
}'

$cscp.CompileAssemblyFromSource($cpar, $code)
$PSHandle = (Get-Process -id $pid).MainWindowHandle
[MyLibrary.Window]::SetWindowPos($PSHandle, 0, 0, 0, 0, 0, $hideWindow)
}
Автор: qik
Дата сообщения: 24.08.2011 07:28
ComradG
Спасибо.
А код для скрытия консоли зачем? То есть я понимаю что он делает, но я вроде не спрашивал про скрытие окон.
Автор: ComradG
Дата сообщения: 24.08.2011 16:15
qik

Цитата:
А код для скрытия консоли зачем?
как пример. по ссылке выше пример компиляции экзешника, а я привел пример компиляции dll с ее последущим вызовом. неужели так трудно было догадаться? чем больше примеров, тем ведь проще разбираться
Автор: qik
Дата сообщения: 25.08.2011 13:10
ComradG
Точно-точно, согласен!

Как связке с# и powershell отследить нажатие пользователем на кнопке в программе?
Грубо говоря используя код про Калькулятор (выше есть в моем комменте) сделать примерно то же самое только не программно кликать и тупо следить за кнопкой и если она нажата выдать сообщение.
Автор: VseNikiZaniatiBlin
Дата сообщения: 30.11.2011 08:04
Ребята привет. Не знаю.. угадал ли тему.
В общем имеется скрипт для повершела.

Код:
############################################################
Write-Host "Загрузка оснастки Active Directory."
#Add-PSSnapin Quest.ActiveRoles.ADManagement

#Функция для чистки входных строк от двойных кавычек
function ClearString ([string]$str){

    $str = $str -Replace ' {2,}',''
    $str = $str.TrimStart()
    $str = $str.TrimStart()

    $str = $str -Replace """""","@"
    $str = $str -Replace """",""
    $str = $str -Replace "@",""""

return $str;

}

$FileATS = "C:\TEST\FINAL\AD_atribut.csv"
$ADSearchRoot = "ru.domen.com/OU/Users"
$pw = read-host "Enter password" -AsSecureString

Connect-QADService -ConnectionAccount "ru.domen.com\Administrator" -ConnectionPassword $pw

$Employes = Get-Content $FileATS
$TotalUsrs = 0
$UpdatedUsrs = 0
foreach ($Emp in $Employes)
{    
    $TotalUsrs++

    $FullName = $Emp.split(';')[0]
    $Org = $Emp.split(';')[1]
    $Dep = $Emp.split(';')[2]
    $Title = $Emp.split(';')[3]
    $IntMobTel = $Emp.split(';')[4]
    $IntStTel = $Emp.split(';')[5]
#     $Manag = $Emp.split(';')[4]
#    $Gorod = $Emp.split(';')[5]
#     $Obl = $Emp.split(';')[6]
#     $Country = $Emp.split(';')[7]
#    $Kabinet = $Emp.split(';')[7]


    $FullName = ClearString($FullName)
    $Org = ClearString($Org)
    $Dep = ClearString($Dep)
    $Title = ClearString($Title)
    $IntMobTel = ClearString($IntMobTel)
    $IntStTel = ClearString($IntStTel)
#    $Manag = ClearString($Manag)
#     $Gorod = ClearString($Gorod)
#    $Obl = ClearString($Obl)
#     $Country = ClearString($Country)
#    $Kabinet = ClearString($Kabinet)

    if ($CurUser = Get-QADUser -SearchRoot $ADSearchRoot -displayName $FullName)
    {    
        "Пользователь $FullName найден..."
        if (@($CurUser).count -gt 1) {
        "Есть полные тезки, пропускаем!"
        continue
        }
        $CurUser | Set-QADUser -Company "$Org" -Department "$Dep" -Title "$Title" -mobile "$IntMobTel" -telephoneNumber "$IntStTel"
        "обновлён."
        $UpdatedUsrs++     
    }
}
"Всего пользователей в файле: $TotalUsrs"
"Обновлено пользователей в AD: $UpdatedUsrs"
############################################################
Автор: Baggurd
Дата сообщения: 27.12.2011 13:13
Что я делаю не так?
Взял скрипт отсюда http://www.howtogeek.com/50187/how-to-create-multiple-users-in-server-2008-with-powershell/

тупо скопировал его
поменял домен
$objOU=[ADSI]“LDAP://OU=abc,DC=contoso,DC=com”
$dataSource=import-csv “users.csv”
foreach($dataRecord in $datasource) {
$cn=$dataRecord.FirstName + ” ” + $dataRecord.LastName
$sAMAccountName=$dataRecord.FirstName + “.” + $dataRecord.LastName
$givenName=$dataRecord.FirstName
$sn=$dataRecord.LastName
$sAMAccountName=$sAMAccountName.ToLower()
$displayName=$sn + “, ” + $givenName
$userPrincipalName=$sAMAccountName + “@contoso.com”
$objUser=$objOU.Create(“user”,”CN=”+$cn)
$objUser.Put(“sAMAccountName”,$sAMAccountName)
$objUser.Put(“userPrincipalName”,$userPrincipalName)
$objUser.Put(“displayName”,$displayName)
$objUser.Put(“givenName”,$givenName)
$objUser.Put(“sn”,$sn)
$objUser.SetInfo()
$objUser.SetPassword(“P@assw0rd”)
$objUser.psbase.InvokeSet(“AccountDisabled”,$false)
$objUser.SetInfo()
}

так выглядит csv
FirstName;LastName
Avis;Flamm
Kurt;Pharris


В результате получаю кучу ошибок

Исключение при вызове "Create" с "2" аргументами: "Был передан недопустимый путь службы каталогов
"
C:\ADscripts\testscript.ps1:11 знак:23
+ $objUser=$objOU.Create <<<< (“user”,”CN=”+$cn)
+ CategoryInfo : NotSpecified: ( [], MethodInvocationException
+ FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI

Исключение при вызове "Put" с "2" аргументами: "Неопознанная ошибка (Исключение из HRESULT: 0x80004005 (E_FAIL))"
C:\ADscripts\testscript.ps1:15 знак:13
+ $objUser.Put <<<< (“givenName”,$givenName)
+ CategoryInfo : NotSpecified: ( [], MethodInvocationException
+ FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI

Исключение при вызове "Put" с "2" аргументами: "Неопознанная ошибка (Исключение из HRESULT: 0x80004005 (E_FAIL))"
C:\ADscripts\testscript.ps1:16 знак:13
+ $objUser.Put <<<< (“sn”,$sn)
+ CategoryInfo : NotSpecified: ( [], MethodInvocationException
+ FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI

Исключение при вызове "SetInfo" с "0" аргументами: "Указан недопустимый dn-синтаксис. (Исключение из HRESULT: 0x80072032)"
C:\ADscripts\testscript.ps1:17 знак:17
+ $objUser.SetInfo <<<< ()
+ CategoryInfo : NotSpecified: ( [], MethodInvocationException
+ FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI

Исключение при вызове "SetPassword" с "1" аргументами: "Указан недопустимый dn-синтаксис. (Исключение из HRESULT: 0x80072032)"
C:\ADscripts\testscript.ps1:18 знак:21
+ $objUser.SetPassword <<<< (“P@assw0rd”)
+ CategoryInfo : NotSpecified: ( [], MethodInvocationException
+ FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI

Исключение при вызове "InvokeSet" с "2" аргументами: "Свойства службы каталогов не могут быть найдены в кэше.
"
C:\ADscripts\testscript.ps1:19 знак:26
+ $objUser.psbase.InvokeSet <<<< (“AccountDisabled”,$false)
+ CategoryInfo : NotSpecified: ( [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodTargetInvocation

Исключение при вызове "SetInfo" с "0" аргументами: "Указан недопустимый dn-синтаксис. (Исключение из HRESULT: 0x80072032)"
C:\ADscripts\testscript.ps1:20 знак:17
+ $objUser.SetInfo <<<< ()
+ CategoryInfo : NotSpecified: ( [], MethodInvocationException
+ FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI

Исключение при вызове "Create" с "2" аргументами: "Был передан недопустимый путь службы каталогов
"
C:\ADscripts\testscript.ps1:11 знак:23
+ $objUser=$objOU.Create <<<< (“user”,”CN=”+$cn)
+ CategoryInfo : NotSpecified: ( [], MethodInvocationException
+ FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI

Исключение при вызове "Put" с "2" аргументами: "Неопознанная ошибка (Исключение из HRESULT: 0x80004005 (E_FAIL))"
C:\ADscripts\testscript.ps1:15 знак:13
+ $objUser.Put <<<< (“givenName”,$givenName)
+ CategoryInfo : NotSpecified: ( [], MethodInvocationException
+ FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI

Исключение при вызове "Put" с "2" аргументами: "Неопознанная ошибка (Исключение из HRESULT: 0x80004005 (E_FAIL))"
C:\ADscripts\testscript.ps1:16 знак:13
+ $objUser.Put <<<< (“sn”,$sn)
+ CategoryInfo : NotSpecified: ( [], MethodInvocationException
+ FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI

Исключение при вызове "SetInfo" с "0" аргументами: "Указан недопустимый dn-синтаксис. (Исключение из HRESULT: 0x80072032)"
C:\ADscripts\testscript.ps1:17 знак:17
+ $objUser.SetInfo <<<< ()
+ CategoryInfo : NotSpecified: ( [], MethodInvocationException
+ FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI

Исключение при вызове "SetPassword" с "1" аргументами: "Указан недопустимый dn-синтаксис. (Исключение из HRESULT: 0x80072032)"
C:\ADscripts\testscript.ps1:18 знак:21
+ $objUser.SetPassword <<<< (“P@assw0rd”)
+ CategoryInfo : NotSpecified: ( [], MethodInvocationException
+ FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI

Исключение при вызове "InvokeSet" с "2" аргументами: "Свойства службы каталогов не могут быть найдены в кэше.
"
C:\ADscripts\testscript.ps1:19 знак:26
+ $objUser.psbase.InvokeSet <<<< (“AccountDisabled”,$false)
+ CategoryInfo : NotSpecified: ( [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodTargetInvocation

Исключение при вызове "SetInfo" с "0" аргументами: "Указан недопустимый dn-синтаксис. (Исключение из HRESULT: 0x80072032)"
C:\ADscripts\testscript.ps1:20 знак:17
+ $objUser.SetInfo <<<< ()
+ CategoryInfo : NotSpecified: ( [], MethodInvocationException
+ FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI
Автор: konst2k6
Дата сообщения: 17.01.2012 08:48

Код: if (-not (test-path "$env:ProgramFiles\7-Zip\7z.exe")) {throw "$env:ProgramFiles\7-Zip\7z.exe needed"}
set-alias sz "$env:ProgramFiles\7-Zip\7z.exe"

sz a -tzip "D:\test1.zip" "D:\Bases\v82\20120110"
sz a -tzip "D:\test2.zip" "D:\Bases\v82\20120111"
Автор: Freiberufler2
Дата сообщения: 17.01.2012 11:55
2konst2k6
Лови живой скрипт Win7 x64 ps v2
#create/restore backup file with datestamp in archive name
dir 'C:\path-to-archive\*.*' -include 'MyDocs_backup*.rar'| Remove-Item #delete old archives
$cmnparam = '"C:\Program files\winrar\rar.exe" a -ag[yyyy-mm-dd] -s -ri1 -mt2 -m0 -r '+
' "C:\path-to-archive\MyDocs_backup.rar" ' +
' @"C:\path-to-extent-2-archiving-files\bak.txt" '
(new-object -ComObject WScript.Shell).Run($cmnparam,1,$True)|Out-Null # waiting OK

<#bak.txt
"C:\path-to-files\*.rar"
#>

Автор: konst2k6
Дата сообщения: 17.01.2012 13:14
спасибо конечно. но логика работы скрипта изначально проблем не вызывает да и winrar не подходит, т.к. пользуемся бесплатным продуктом. сложность именно с добавлением даты в имя создаваемого архива.
Автор: ComradG
Дата сообщения: 17.01.2012 13:47
konst2k6
а не проще ли воспользоваться командлетом Get-Date (благо тот обладет большим количеством параметров), загнав полученные данные в переменную типа string, а после передавать эту переменную далее по конвееру?
Автор: konst2k6
Дата сообщения: 17.01.2012 14:46
говорю же. )) с логикой проблем нет. )) проблема со вставкой переменной в кавычки. ))
Автор: ComradG
Дата сообщения: 17.01.2012 16:13
konst2k6
дык а я про что? вынеси дату в переменную и через foreach штампуй файлы.
Автор: ComradG
Дата сообщения: 19.01.2012 10:44
BOBAT

Код: #каталог с файлами для загрузки
$dir = "d:\myuploadfiles"

#куда будут грузится файлы
$ftp = "ftp://ftp.myserver.com/pub/destination"
#имя пользователя
$user = "user"
#пароль доступа
$pass = "pass"

#создаем веб-клиент
$client = New-Object System.Net.WebClient
#передаем имя и пароль для авторизации
$client.Credidentals = New-Object System.Net.NetworkCredidental($user, $pass)

#ну, а далее сам процесс загрузги файлов
foreach($item in (dir $dir "*.trc")) {
"Загрузга файла $item..."
$uri = New-Object System.Uri($ftp + $item.Name)
$client.UploadFile($uri, $item.FullName)
}

Страницы: 1234567

Предыдущая тема: Assembler


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.