在 Powershell 中以系统用户身份运行命令

问题描述 投票:0回答:4

我在网上找到了几个答案,但并不是我真正想要的。

问题如下: 使用“Networker”恢复文件时,文件的 ACL 与备份文件时的 ACL 相同,无论文件恢复到的文件夹中的继承情况如何。意味着ACL的继承不会影响新恢复的文件。

这给我留下了一个问题:只有 3 个帐户有权更改 ACL。

  • 用户,文件所属
  • 域管理员
  • 系统帐号

为了解决这个问题,我想运行一个自动脚本来修复 ACL 并激活正确的继承。

脚本的系统用户必须是这三个用户之一。 用户正在更改,因此不是一个有效的选择,我也不想留下任何域管理员凭据,也不想向服务帐户授予域管理员权限。

这给我留下了系统帐户来完成这项工作,问题来了:

如何在系统帐户凭据下在 powershell 中执行任务?

我试过了

$username = "NT Authority\System"
$password = ConvertTo-SecureString -String "" -AsPlainText -Force
$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist @($username, $password)

由于密码为空,我无法真正用它创建凭据。

所有区域设置中的帐户名称都是 .\LocalSystem。名字, 也可以使用 LocalSystem 或 ComputerName\LocalSystem。此帐户 没有密码。 https://msdn.microsoft.com/de-de/library/windows/desktop/ms684190(v=vs.85).aspx

所以现在我对如何让它发挥作用有点困惑。

编辑: 文件系统运行在 EMC 上,并不是真正的 Windows 文件系统,只是有点挂接到 Linux 系统上。所以没有本地管理员帐户。

TL;博士

我想通过powershell继承系统账户对文件的ACL权限,如何实现?

windows powershell acl local-system-account
4个回答
4
投票

https://github.com/mkellerman/Invoke-CommandAs

使用提供的凭据或系统创建了针对本地/远程计算机调用命令的功能。返回 PSObjects,处理网络中断并解决任何双跳问题。

尝试一下,如果这可以解决您的问题,请告诉我。


3
投票

如果您可以安装(非常有用的)第三方程序,您可以尝试以下操作。这是一个便携式 .zip,无需实际安装。

以管理员身份运行:

C:\WINDOWS\system32>nircmd.exe elevatecmd runassystem c:\windows\System32\cmd.exe

启动一个新的cmd窗口:

Microsoft Windows [Version 10.0.18362.418]

(c) 2019 Microsoft Corporation. All rights reserved.

C:\WINDOWS\system32>whoami
nt authority\system

C:\WINDOWS\system32>

https://www.nirsoft.net/utils/nircmd.html


2
投票

域管理员通过本地管理员组获得访问权限。本地管理员可以取得任何本地对象的所有权,并随后向该对象授予新权限。

以管理员身份运行类似的操作应该可以满足您的要求:

takeown /f C:\some\file_or_folder /a /r /d:y
icacls C:\some\file_or_folder /reset /t /c /q

切勿使用 SYSTEM 帐户进行此类操作。


0
投票

如果脚本不涉及任何用户参数或环境变量,请尝试使用任务计划程序:

$SchedScript = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument '-ExecutionPolicy Bypass -file "%yourscriptpath%"'
Register-ScheduledTask -User SYSTEM -taskname !_SchedScript -Action $SchedScript | Out-Null
Start-ScheduledTask -TaskName "!_SchedScript" | Out-Null
$SchedCheck = (Get-ScheduledTask "!_SchedScript").state
do {Start-Sleep -Seconds 5; $SchedCheck = (Get-ScheduledTask "!_SchedScript").state; write-host (Get-Date) $SchedCheck} While ($SchedCheck -eq "Running")
Unregister-ScheduledTask -TaskName "!_SchedScript" -Confirm:$false

如果您需要运行命令,请使用不同的参数,例如删除此处的所有文件:

$SchedScript = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument '-command remove-item "C:\temp\*.*" -confirm:$false'
© www.soinside.com 2019 - 2024. All rights reserved.