标签: powershell

是否可以列出我无权访问的所有权限

我正在寻找一种方法来递归遍历我的整个文件共享(相当大的 3TB 文件)并列出我无权访问的所有文件/文件夹。由于迁移和大路径(超过 255 个字符)上的一些错误,我们发现一些文件夹/文件丢失了所有权限,需要一种方法来找到它们。目前作为域管理员用户,我无法列出权限或所有者。我可以控制它并重置权限,但是我有太多的文件/文件夹,我想将其输出到 CSV 文件或其他内容。

我试过以下:

get-childitem "\,\fileshare\f$\folder\etc" -recurse | get-acl
Run Code Online (Sandbox Code Playgroud)

这似乎工作得很好,它为我提供了所有存在并对其具有适当权限的文件/文件夹的 ACL。但是一旦它进入我无权访问的文件夹,我就会收到以下错误:

Get-Acl : Attempted to perform an unauthorized operation.
At line:1 char:133
+ get-childitem "\,\fileshare\f$\folder\etc" -re
curse | get-acl <<<<
    + CategoryInfo          : NotSpecified: (:) [Get-Acl], UnauthorizedAccessException
    + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.GetAclCommand
Run Code Online (Sandbox Code Playgroud)

这些是我想记录到 CSV/TXT 文件中的错误,并忽略所有其余的权限,如果每个错误方式也可以以更多行输出,那将是理想的。

只是想知道是否有人对我应该如何进行有想法或提示?

(请注意上面的路径中有逗号是故意不解析为真实路径

\,\fileshare\f$\folder\etc)
Run Code Online (Sandbox Code Playgroud)

谢谢!

windows powershell permissions ntfs access-control-list

5
推荐指数
1
解决办法
7144
查看次数

为什么 Remove-ADGroupMember 默认需要确认?

在脚本中,我需要管理组的成员资格。不幸的是,用于从组中删除成员的 cmdletRemove-ADGroupMember总是要求确认。这与所描述的 cmdlet 行为相矛盾,因为有一个-Confirm选项应该打开确认。这需要使用模糊且记录不充分的冒号将值绑定到 switch 参数: -Confirm:$false,此时使用简单的-Forceswitch会更有意义。

环境中是否存在更改 cmdlet 行为方式的设置?这只是一个实现不佳的功能吗?我是否遗漏了一些可以解释开关参数令人困惑的行为的明显文档?

powershell active-directory

5
推荐指数
1
解决办法
1万
查看次数

Exchange 的 New-MailboxExportRequest 对 ContentFilter 的 DateTime 参数表现得很奇怪

我试图从邮箱中提取特定日期范围的电子邮件到 PST,但使用 DateTime 参数ContentFilter似乎没有按预期工作。

这应该导出过去 5 天的所有内容:

$endDate = Get-Date "00:00:00"
$startDate = $endDate.AddDays(-5)

Write-Host "Exporting items between $startDate and $endDate..."

New-MailboxExportRequest -ContentFilter {(Received -ge $startDate) -and (Received -lt $endDate)} -Mailbox "EmailLog" -FilePath "\\ReadyNAS\backup\Mailboxes\EmailLog\EmailLog.pst"
Run Code Online (Sandbox Code Playgroud)

但是 PST 最终会在其中包含完整的 15+Gb 邮箱。

如果我手动指定日期,它工作正常:

New-MailboxExportRequest -ContentFilter {(Received -ge "01-06-2013 00:00:00") -and (Received -lt "06-06-2013 00:00:00")} -Mailbox "EmailLog" -FilePath "\\ReadyNAS\backup\Mailboxes\EmailLog\EmailLog-man.pst"
Run Code Online (Sandbox Code Playgroud)

我不确定这是否是由于某种区域设置冲突造成的,但我认为传递类型化参数会避免这种愚蠢行为。我怀疑这是因为如果我打印出日期(第一个示例中的 Write-Host),日期会以美国格式显示:

[PS] C:\Windows\system32>Write-Host "Exporting items between $startDate and $endDate..."
Exporting items between 06/01/2013 00:00:00 and 06/06/2013 00:00:00...
Run Code Online (Sandbox Code Playgroud)

powershell exchange-2010

5
推荐指数
1
解决办法
3710
查看次数

以 NT AUTHORITY\SYSTEM 身份运行 PowerShell 命令

有没有办法NT AUTHORITY\SYSTEM从脚本中运行 PowerShell 命令?
我知道我可以使用psexec并让 PowerShell 提示符作为 运行NT AUTHORITY\SYSTEM,但我想知道是否有办法从“正常”脚本中执行此操作。

powershell

5
推荐指数
1
解决办法
2万
查看次数

用于删除最旧文件的 Powershell 脚本(与当前日期无关)

我不要想“比X天的删除文件。” 如果我想这样做,我只会选择已经为此目的编写的数千个脚本中的一个,而且我不会费心在 ServerFault 上提出这样一个微不足道的问题。

我确实想删除特定文件夹中除最近的 N 个文件之外的所有文件。

背景:远程系统配置为将定期存档文件转储到 Windows 服务器上的共享。这些文件的命名约定为 YYYYMMDD-hhmm.ext。如果存档过程失败,我不希望清除脚本仅仅因为文件比这么多天旧而删除文件。无法将远程系统配置为在归档过程中清除文件。

例如,当脚本运行时,文件夹中可能有 10 个文件,可能有 7 个文件,可能有 5 个文件。我需要始终至少保留最近的 5 个,无论它们有多大。

这可以用 PowerShell 完成吗?

编辑:忽略与命名约定不匹配的文件或文件夹是可取的。不应删除其他文件和文件夹,也不应将它们混淆(导致保留的存档文件少于 5 个)。

scripting powershell

5
推荐指数
2
解决办法
1万
查看次数

为 VM Hyperv 分配静态 MAC 地址

我有一个涉及在 Hyper-V 中构建大量虚拟机的场景,我不能使用 SCVMM,必须使用脚本方法来创建这些 VM。我有一个 CSV 文件,其中填写了所有必需的信息,因此我的 Create-VM 代码可以正常工作并且可以毫无问题地创建 VM。

我的问题是,我想在创建过程中为 VM NIC 分配一个静态 MAC 地址。这将帮助我根据我的实验室要求设置 DHCP IP 预留。创建 VM 后,我执行以下命令:

Set-VMNetworkAdapterVlan -VMName $VMName -Access -ComputerName $VMHost -VlanId $VLANID | Get-VMNetworkAdapter | Set-VMNetworkAdapter -StaticMacAddress $Config.intMAC
Run Code Online (Sandbox Code Playgroud)

此时,我已经将一个 NIC 添加到此 VM,理论上它应该将 MAC 地址设置为 $Config.intMAC 持有的任何内容,但它没有,仍然为动态 MAC 地址选择了单选框,并且静态值保持未选择状态,并且全0。

我将如何以编程方式分配 MAC?

scripting powershell hyper-v windows-server-2012

5
推荐指数
1
解决办法
8558
查看次数

删除所有邮箱的 Exchange 2010 自动映射的脚本

我有一台 Exchange 2010 SP3 服务器,它从 MSExchangeIS 获取应用程序事件错误 9646:

Mapi 会话 [ID] [AD 用户] 超过了“objtFolder”类型的最大 500 个对象

对此进行调查,发现原因是几个用户对其他人的邮箱拥有大量完全访问权限。

由于这种方式在 SP1 中发生了变化,请参阅此处的 Technet 文章,他们现在会自动打开他们有权访问的所有用户,而不是仅在需要时才能够添加或打开它们。

理想情况下,我想要一个脚本,我可以运行它来全局删除所有用户的 -Automapping $true 字符串:这应该让他们在需要时访问邮箱,但阻止它自动打开,占用 MAPI 会话。

我从上面的 URL 尝试了 Microsoft Technet 脚本,但这似乎没有按预期工作:

[PS]$FixAutoMapping = Get-MailboxPermission sharedmailbox|where {$_AccessRights -eq "FullAccess" -and $_IsInherited -eq $false}
The operation couldn't be performed because object sharedmailbox couldn't be found on '[Servername]'.
    + CategoryInfo          : InvalidData: (:) [Get-MailboxPermission], ManagementObjectNotFoundException
+ FullyQualifiedErrorId : B485A4C7,Microsoft.Exchange.Management.RecipientTasks.GetMailboxPermission
Run Code Online (Sandbox Code Playgroud)

我假设 sharedmailbox 是一个在我的服务器上不存在的特定示例邮箱:我需要一个脚本来搜索所有邮箱,然后将 Automapping $true 更改为 Automapping $false 以获取对邮箱的任何访问权限。 …

powershell exchange exchange-2010 outlook-2007 outlook-2010

5
推荐指数
1
解决办法
6931
查看次数

如何使用 PowerShell 列出隐藏的管理共享?

我正在尝试编写一个脚本来审核几个 HIPAA 敏感服务器上的共享文件夹。我使用 获得了一个很好的共享列表gwmi Win32_Share,但是当我使用获取每个共享的权限时gwmi Win32_LogicalShareSecuritySetting,隐藏的管理共享没有列出。

我意识到这是出于显而易见的原因,这不像权限更改,但我想要某种迹象表明这实际上是管理共享。目前我正在使用 try-catch 块来处理错误并踢出“找不到权限”消息。

有什么方法可以使用 PowerShell 仅列出隐藏的管理共享?

security windows powershell network-share

5
推荐指数
1
解决办法
4166
查看次数

使用 PowerCLI 检查分区对齐

我正在尝试验证我正在处理的每台服务器中的文件系统分区是否正确对齐。我有以下脚本,当我尝试运行时,将根据我使用的 if 语句(其中一个被注释掉)声明所有虚拟服务器已对齐或未对齐:

$myArr = @()
$vms = get-vm | where {$_.PowerState -eq "PoweredOn" -and $_.Guest.OSFullName -match "Microsoft Windows*" } | sort name
foreach($vm in $vms){
    $wmi = get-wmiobject -class "win32_DiskPartition" -namespace "root\CIMV2" -ComputerName $vm
    foreach ($partition in $wmi){
        $Details = "" | Select-Object VMName, Partition, Status
        #if (($partition.startingoffset % 65536) -isnot [decimal]){
        if ($partition.startingoffSet -eq "65536"){
            $Details.VMName = $partition.SystemName
            $Details.Partition = $partition.Name
            $Details.Status = "Partition aligned"
        }
        else{
            $Details.VMName = $partition.SystemName
            $Details.Partition = $partition.Name
            $Details.Status = "Partition not aligned" …
Run Code Online (Sandbox Code Playgroud)

powershell vmware-esxi powercli partition-alignment

5
推荐指数
1
解决办法
820
查看次数

使用三个参数运行 32 位 PowerShell 脚本的计划任务

TLDR 版本

我需要运行一个 32 位 PowerShell 脚本,该脚本采用三个参数作为Windows Server 2008 R2 中的计划任务。该脚本启动一个 FileSystemWatcher,所以我需要让它保持活动状态,以便它可以继续接收新文件。

如果您要略读,您可能应该查看下面“参数”下的内容。

背景

我创建了一个 PowerShell 脚本,它可以在我的 Windows Server 2008 R2 机器上的 x86 PowerShell 控制台中正常运行。它创建一个 FileSystemWatcher,并为文件创建事件注册一个动作。因为我需要 FileSystemWatcher 继续观察,所以我需要 PowerShell 继续运行,而不是在脚本被触发后立即退出:

该脚本采用三个参数:

  1. 要观看的文件夹的路径
  2. 将移动任何新的 .xlsx 文件并根据 .xlsx 文件的内容写入输出文本文件的文件夹的路径。
  3. 日志文件的路径。

但是,我无法让脚本作为计划任务正确运行。我认为问题在于我使用的参数,但我不知道哪些参数是正确的。

设置

由于需要脚本在32位PowerShell中运行,我将定时任务的程序设置为%SystemRoot%\syswow64\WindowsPowerShell\v1.0\powershell.exe。

我已确保在 32 位 PowerShell 中将本地计算机的执行策略设置为 RemoteSigned。

参数

我为我的论点尝试了几种不同的变体。以下在 Console 中运行,但在Task Scheduler 中以某种方式失败:

任务运行,但它没有写入日志文件,这表明它可能甚至没有启动 FileSystemWatcher。在任何情况下,它在创建文件时都不会拾取文件:

powershell -Noexit -File "D:\Scripts\myScript.ps1" "\\otherServer\share\folder\subfolder\" "\\someserver.domain.edu\D$\working_directory\" "\\otherServer\share\folder\my_log.txt"
Run Code Online (Sandbox Code Playgroud)

任务以代码 0xFFFD0000 退出(请参阅Powershell 计划任务的 0xFFFD0000 的最后结果)。我确信该任务正在作为适当的服务帐户运行,该帐户可以访问参数中使用的网络共享。

powershell -Noexit -File 'D:\Scripts\myScript.ps1' '\\otherServer\share\folder\subfolder\' …
Run Code Online (Sandbox Code Playgroud)

powershell scheduled-task windows-server-2008-r2

5
推荐指数
1
解决办法
4709
查看次数