创建了PowerShell模块,它具有函数并为该函数公开cmdlet。内置PowerShell 5.1和pwsh.exe 7.3.1(使用MSI安装程序安装)可以检测并运行cmdlet,没有问题。
现在,我需要该cmdlet在Windows任务计划程序中**"无论用户是否登录都运行"**。
当我尝试将PowerShell模块的cmdlet作为NT AUTHORITY\SYSTEM
运行时,问题出现了。
我需要这样做,因为在任务调度程序中,that appears to be是获得调度任务"无论用户是否登录都运行"的唯一方法。(我不想手动输入任何Windows用户帐户的用户名或密码)
理想情况下,我宁愿使用内置的管理员安全组,但如您所见,如果用户未登录,我将无法运行任务。
所以我真的被困在这里,不知道该怎么做,我想这是我遇到的边缘情况之一。
- 我需要找到一种方法,以便在PowerShell作为SYSTEM运行时,它仍然能够检测到我的模块的cmdlet。**
我知道当PowerShell作为SYSTEM运行时检测不到我的cmdlet,因为我使用PsExec64测试了它。
我把我的PowerShell模块放在这里(这是他们从网上画廊默认安装):
C:\Users\<UserName>\OneDrive\Documents\PowerShell\Modules\ModuleFolder
这是我用来创建任务的PowerShell脚本的整个块。
$action = New-ScheduledTaskAction -Execute "pwsh.exe" -Argument "-command 'myCmdLet -parameter1 $variable1"
# First thing I tried
$TaskPrincipal = New-ScheduledTaskPrincipal -GroupId "BUILTIN\Administrators" -RunLevel Highest
# Second thing I tried
$TaskPrincipal = New-ScheduledTaskPrincipal -UserID "NT AUTHORITY\SYSTEM" -LogonType ServiceAccount -RunLevel Highest
$trigger = New-ScheduledTaskTrigger -AtStartup
Register-ScheduledTask -Action $action -Trigger $trigger -Principal $TaskPrincipal -TaskName "Name" -Description "Description"
$TaskSettings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -Compatibility Win8 -StartWhenAvailable
Set-ScheduledTask -TaskName "Name" -Settings $TaskSettings
- 更新日期:**
我找到了一个办法:
$TaskPrincipal = New-ScheduledTaskPrincipal -LogonType S4U -UserId $env:USERNAME -RunLevel Highest
这将以管理员身份运行任务(因为模块cmdlet在没有管理员权限的情况下甚至无法工作),并且还选中了这两个框,这是我非常想做的。但是,仍然在寻找一种方法,使PowerShell在以SYSTEM身份运行时知道我的模块cmdlet,它将提供1个好处,即AFAIK,这是为了消除对计算机上现有特定用户帐户的依赖性。
1条答案
按热度按时间bqjvbblv1#
总结如下:
NT AUTORITY\SYSTEM
)将 * 看不到 * 该模块。-Scope AllUsers
参数传递给Install-Module
(需要提升),为 * 所有 * 用户安装该模块。Import-Module
调用,如下所示。NT AUTORITY\SYSTEM
的身份运行任务 * 总是 * 运行:-LogonType Service
。C:\Windows\System32
为工作控制器<hostname>$
反映在$env:USERNAME
中,其中<hostname>
是本地计算机的名称,以及C:\Windows\system32\config\systemprofile
的$HOME
/$env:USERPROFILE
文件夹。以下自包含示例:
NT AUTHORITY\SYSTEM
运行~/_test.psm1
和~/_test.txt
,临时任务命名为_Test
)样本输出:
最后4行是模块函数(
Get-Foo
)的输出,证明模块已成功导入到任务上下文中。