远程作业作为标准用户

时间:2015-06-28 21:51:04

标签: powershell remoting credentials

好的,我正在参加星期天比赛!有一个新的趾脚。我正在尝试做一些远程处理,特别是我想以登录用户身份运行远程作业。谁不是本地管理员。如果我以管理员用户身份运行,即使标准用户已登录,它仍可正常工作。但如果我使用标准用户凭据运行,则会因“拒绝访问”而失败。使该用户成为本地管理员,它的工作原理。我几乎可以肯定,问题只是你不能在非管理员用户的情况下运行远程工作,但我似乎无法找到任何相关的文档。那么,有人可以验证这种情况,我会开始寻找其他选择吗?或者让我知道与标准用户一起做的秘密酱。 ;)

此外,对于上下文,此处的目标是为会议实验室环境自动执行某些用户清理。实验室中的每台计算机都具有相同的用户帐户。我想在服务器上运行一个脚本,它可以作为标准用户运行远程作业,并执行许多操作,包括清除用户桌面,我的文档和收藏夹,以及清除任务栏中的所有快捷方式和用会议标准重建。我们的想法是在每个会话开始之前手动运行它,这样每个会话中的代表就能得到那个很好的"新计算机"闻。我已经将它作为登录类型安排工作,但我不喜欢这样,因为有时机器需要在会话期间重新启动而我不想过早地擦除它们。我也可以在每台机器上将其作为计划任务执行,但是会出现会话运行时间长的问题。我不想让计划的任务很快运行。我真的希望在时机成熟时手动启动它。

我正在考虑的替代方法是使这些任务测试特定的env var或reg键,我可以通过脚本推送然后重新启动。然后,任务将运行,但稍后重新启动将不会运行这些任务,因为触发任务的标志将丢失。问题是,我需要启用远程注册表,这是我不喜欢的,我需要让所有用户都能使用HKLM中的标志键。或者我可以用系统env var来做,但是我需要有第二个脚本删除标志,因为标准用户无法修改系统env var。所有这些都比仅仅作为委托用户运行作业更加紧凑。 :(

而且,作为一个额外的问题,我曾希望让远程工作发出气球通知,让机器上的任何人知道发生了什么。但似乎我也失去了这种能力,所以我想知道是否有人有一个很好的方法来发送消息到远程机器,理想情况下在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)

1 个答案:

答案 0 :(得分:0)

咄!有时我会在解决问题一段时间后解决问题,当事情还没有完全发挥作用时,我认为我还没有完全解决问题。在这种情况下,我实际上有一个全新的问题(对于一个新线程)并且远程问题已经解决。这里修改后的代码是我最终得到的。

$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