作为标准用户的远程作业

remote jobs as standard user

好的,我参加了星期天演出!有一个新的脚趾。我正在尝试进行一些远程处理,特别是我想 运行 作为登录用户进行远程作业。谁不是本地管理员。如果我 运行 作为管理员用户它工作,即使标准用户已登录。但是如果我 运行 使用标准用户凭据它会失败并拒绝访问。使该用户成为本地管理员并且它有效。我几乎可以肯定问题只是您不能 运行 在非管理员用户的上下文中进行远程作业,但我似乎找不到任何相关文档。那么,有人可以验证情况是否如此,我将开始寻找替代方案吗?或者告诉我与标准用户一起做这件事所需的秘诀。 ;)

此外,对于上下文,这里的目标是为会议实验室环境自动执行一些用户清理。实验室中的每台机器都有相同的用户帐户。我想要服务器上的一个脚本,我可以 运行,运行 作为标准用户的远程作业,并做很多事情,包括清除用户桌面、我的文档和收藏夹,以及擦除清除任务栏中的所有快捷方式并使用会议标准进行重建。这个想法是在每个 session 开始之前手动 运行,这样每个 session 中的代表都能闻到那种美妙的 "new computer" 气味。我已经将其用作登录类型安排,但我不喜欢这样,因为有时机器需要在 session 中途重新启动,我不想过早地清除所有内容。我也可以在每台机器上作为计划任务来做,但是这样就出现了session运行宁长的问题。我不想很快得到预定任务 运行。我真的希望在适当的时候手动启动它。

我正在寻找的替代方法是让这些任务测试特定的环境变量或注册密钥,我可以通过脚本推送它们,然后重新启动。然后任务将 运行,但稍后重新启动不会 运行 这些任务,因为触发任务的标志将丢失。存在的问题是,我需要启用我不喜欢的远程注册表,并且我需要授予所有用户使用 HKLM 中的标志键的权利。或者我可以使用系统环境变量来完成,但是我需要第二个脚本来删除标志,因为标准用户无法修改系统环境变量。所有这些都比仅 运行 以委托用户身份完成工作要紧凑得多。 :(

而且,作为一个附加问题,我曾希望让远程作业触发一个气球通知,让机器上的任何人都知道发生了什么。但似乎我也失去了这种能力,所以我想知道是否有人有向远程机器发送消息的好方法,最好是在 Win 7 和 Win 8/10 中工作的方法,甚至可能允许在登录屏幕上显示临时消息(但这有点切线)。

当前尝试看起来像这样

Invoke-Command -sessionOption:(New-PSSessionOption -noMachineProfile) -computerName:$machine -argumentList: $filePath –scriptblock {
   param (
      [String]$filePath
   )

      & powershell.exe -executionpolicy bypass -file $filePath

   } -credential:$credential  -authentication:CredSSP –asJob -jobName:$machine > $null

编辑:权限代码

$sddl = (Get-PSSessionConfiguration -Name "Microsoft.PowerShell").SecurityDescriptorSDDL
$sid = (New-Object Security.Principal.NTAccount "NT AUTHORITY\Authenticated Users").Translate([Security.Principal.SecurityIdentifier]).Value

$security_descriptor = New-Object -TypeName System.Security.AccessControl.CommonSecurityDescriptor -ArgumentList @($false, $false, $sddl)
$security_descriptor.DiscretionaryAcl.AddAccess("Allow", $sid, 268435456, "None", "None")

# Convert the Security Descriptor back into SDDL
$security_descriptor.GetSddlForm([System.Security.AccessControl.AccessControlSections]::All)

呸!有时我在解决问题一段时间后解决了问题,当事情仍然没有完全解决时,我认为我还没有完全解决问题。在这种情况下,我实际上遇到了一个全新的问题(对于一个新线程)并且远程处理问题得到了解决。这里修改后的代码是我最终得到的。

$sid = (New-Object Security.Principal.NTAccount 'NT AUTHORITY\Authenticated Users').Translate([Security.Principal.SecurityIdentifier]).Value
$sddl = (Get-Item WsMan:\localhost\service\rootSDDL).Value 
$securityDescriptor = New-Object -typeName: Security.AccessControl.CommonSecurityDescriptor($false, $false, $sddl)
$securityDescriptor.DiscretionaryAcl.AddAccess('Allow', $sid, 268435456, 'None', 'None')

$newSddl = $securityDescriptor.GetSddlForm([System.Security.AccessControl.AccessControlSections]::All)

Set-PSSessionConfiguration -name: 'Microsoft.PowerShell' -securityDescriptorSddl: $newSddl -force > $null