PS脚本执行策略

描述:PowerShell的执行策略是一项安全功能有助于防止执行恶意脚本,可控制PS加载配置文件和运行脚本的条件。
本地计算机和当前用户的执行策略存储在注册表中,您无需在PowerShell配置文件中设置执行策略。特定会话的执行策略仅存储在内存中,并且在关闭会话时丢失。

执行策略列表(List Execution Policoes):

  • AllSigned: 签名认证,要求所有脚本和配置文件均由受信任的发布者签名,包括您在本地计算机上编写的脚本。
  • Bypass: 没有任何阻止也没有警告或提示;此执行策略设计用于将PowerShell脚本内置到更大的应用程序中的配置,或者用于以PowerShell为具有自己的安全模型的程序的基础的配置。
  • Default: 设置默认执行策略,WindowsPC端默认Restricted ,Windows服务器默认策略RemoteSigned
  • RemoteSigned: 服务器默认执行策略。脚本可以进行执行,需要从可信任的发布者处获得从互联网上下载的脚本和配置文件的数字签名,可能会运行来自Internet以外来源和已签名但恶意的脚本的未签名脚本。
  • Restricted: 严格模式,Windows客户端计算机的默认执行策略。允许使用单个命令但不允许使用脚本。阻止运行所有脚本文件,包括格式和配置文件.ps1xml , 模块脚本 .psm1 , PS配置文件.ps1;
  • Unrestricted: 未签名的脚本可以运行。有运行恶意脚本的风险。 在运行非本地Intranet区域中的脚本和配置文件之前警告用户

执行策略范围:

  • MachinePolicy:由组策略为计算机的所有用户设置。
  • UserPolicy:由组策略为计算机的当前用户设置。
  • Process:进程作用域仅影响当前的PowerShell会话。
  • CurrentUser:执行策略仅影响当前用户。它存储在HKEY_CURRENT_USER注册表子项中。
  • LocalMachine:执行策略会影响当前计算机上的所有用户。它存储在HKEY_LOCAL_MACHINE注册表子项中

使用PowerShell管理执行策略

  • Get-ExecutionPolicy :要获取影响当前会话的所有执行策略;
  • Set-ExecutionPolicy :设置当前会话的执行策略;

基础实例:

#1.获取查看当前会话用户执行策略权限
PS C:\WeiyiGeek> Get-ExecutionPolicy
Unrestricted

PS C:\WeiyiGeek> Get-ExecutionPolicy -list
# Scope ExecutionPolicy
# ----- ---------------
# MachinePolicy Undefined
# UserPolicy Undefined
# Process Undefined
# CurrentUser Undefined
# LocalMachine Unrestricted

Get-ExecutionPolicy -Scope CurrentUser #获取指定范围执行权限
Undefined


#2.更改执行政策更改立即生效,无需重新启动PowerShell。
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachine
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

WeiyiGeek.

备注:

  • Windows10机器下必须以管理员进行运行上述的cmdlet;

加载程序集

自定义一个简单的C#类库编译为Test.dll:

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;

namespace Test
{
public class Student
{
public string Name { set; get; }
public int Age { set; get; }
public Student(string name, int age)
{
this.Name = name;
this.Age = age;
}
public override string ToString()
{
return string.Format("Name={0};Age={1}", this.Name,this.Age);
}
}
}

在PS中加载这个dll并使用其中的Student类的构造函数生成一个实例,最后调用ToString()方法。

PS > $TestDLL=ls .Test.dll
PS > [reflection.assembly]::LoadFile($TestDLL.FullName) #加载DLL到PS中
# GAC Version Location
# --- ------- --------
# False v2.0.50727 Test.dll

PS > $stu=New-Object Test.Student('Mosser',22) #创建对象
PS > $stu
Name Age
---- ---
Mosser 22
PS > $stu.ToString() #调用重写的ToString方法
Name=Mosser;Age=22


使用COM对象

描述:作为.NET的补充,Powershell可以加载和访问COM对象。
常用的COM对象中有:

  • WScript.Shell,
  • WScript.Network,
  • Scripting.FileSystemObject,
  • InternetExplorer.Application,
  • Word.Application,
  • Shell.Application
#1.每一个COM对象都有存储在注册表中的唯一标识符,想遍历访问可用的COM对象,可是直接访问注册表。
Dir REGISTRY::HKEY_CLASSES_ROOTCLSID -include PROGID -recurse | foreach {$_.GetValue("")} | select -First 10
#COM对象的ProgID
DAO.DBEngine.36
DAO.PrivateDBEngine.36
DAO.TableDef.36
DAO.Field.36
DAO.Index.36
DAO.Group.36
DAO.User.36
DAO.QueryDef.36
DAO.Relation.36

#使用New-Object创建COM对象,只需要指定参数为-comObject
PS > $DBEng=New-Object -ComObject DAO.PrivateDBEngine.36
PS > $DBEng | Get-Member -me *method #查看方法
PS > $DBEng | Get-Member -me *property #查看属性

下面的例子:使用WScript.shell COM对象和它的方法CreateShortcut()做桌面上创建一个Powershell快捷方式:

PS> $shell=New-Object -ComObject WScript.shell
PS> $link=$shell.CreateShortcut("$path/Powershell.lnk")
PS> $link.TargetPath='Powershell.exe'
PS> $link.Description="启动Powershell"
PS> $link.WorkingDirectory=$PROFILE
PS> $link.IconLocation='Powershell.exe'
PS> $link.Save()
PS> $link
# FullName : C:\Users\WeiyiGeek\Desktop\Powershell.lnk
# Arguments :
# Description : 启动Powershell
# Hotkey :
# IconLocation : Powershell.exe,0
# RelativePath :
# TargetPath : C:\Windows\System32\WindowsPowerShell\v1.0\Powershell.exe
# WindowStyle : 1
# WorkingDirectory : C:\Users\WeiyiGeek\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

$link | get-member
TypeName:System.__ComObject#{f935dc23-1cf0-11d0-adb9-00c04fd58a0b}
TargetPath Property string TargetPath () {get} {set}
#Get
$link.TargetPath()
#Set
$link.TargetPath="cmd.exe"


$SwitchUser = ([System.Management.Automation.Host.ChoiceDescription]"&Switchuser")
$LoginOff = ([System.Management.Automation.Host.ChoiceDescription]"&LoginOff")
$Lock= ([System.Management.Automation.Host.ChoiceDescription]"&Lock")
$Reboot= ([System.Management.Automation.Host.ChoiceDescription]"&Reboot")
$Sleep= ([System.Management.Automation.Host.ChoiceDescription]"&Sleep")

$selection = [System.Management.Automation.Host.ChoiceDescription[]]($SwitchUser,$LoginOff,$Lock,$Reboot,$Sleep)
$answer=$Host.UI.PromptForChoice('接下来做什么事呢?','请选择:',$selection,1)
"您选择的是:"
switch($answer)
{
0 {"切换用户"}
1 {"注销"}
2 {"锁定"}
3 {"重启"}
4 {"休眠"}
}
接下来做什么事呢?
请选择:
[S] Switchuser [L] LoginOff [L] Lock [R] Reboot [S] Sleep [?] 帮助 (默认值为“L”): Reboot
您选择的是:
重启