文件属性

[datetime]$lw = "2021/12/12 22:10:15"
New-Item -Type File -Path t.txt -OutVariable t
$t.LastWriteTime = $lw

lstm.png

$t | gm

属性里带{get,set}的都是可以直接赋值的,直接修改文件属性。

下载文件锁定

锁定.png

Unblock-File <文件名>

代码签名

刚刚的那张图片上的软件无法验证数字签名,在电脑上是不能安装的。我们给它重新签个名。 数字签名.png 代码签名证书文档 签名cmdlet.

ls Cert:\CurrentUser\My\  -Recurse -OutVariable c
$c = $c[0]
Set-AuthenticodeSignature -Certificate $c -FilePath <.exe,.dll,脚本文件>

安全要求高的地方,需要CA颁发的管理员证书,签署过的脚本,才能在生产环境执行。

重复文件查找

有一些共享文件夹,时间久了会有很多重复的文件存在。 一个个的比对删除不太现实,要是有点线索处理起来就会快很多了。

[CmdletBinding()]
param (
    [Parameter()]
    [string]
    $FilePath
)
$ht = @{}
$al = New-Object -TypeName System.Collections.ArrayList
$hl = Get-ChildItem -Path $FilePath -Recurse -File | Get-FileHash
foreach($h in $hl){
    if($ht[$h.hash]){
        $al.add($h)
    }else{
        $ht[$h.hash] = $h
    }
}
$al | export-csv -Path t.csv

思路很简单,获取文件hash值,一个空hash表和一个数组。 把文件hash作为键,条目作为值。如果键存在就把条目存到数组中,最后输出数组到csv文件中。 也可以用数组反查hash表,然后两个数组用hash排序基本上能够数据对齐的去比对重复文件了。获取文件hash的开销有点大,所以性能不太好,夜间没有负载的时候也可以拿来跑跑看。用这个需求练练手也不错,比如说统计下文件类型的总大小,有域环境的统计下每个文件所有者在共享中共使用了多少空间,各种类型的文件是多少。