【问题标题】:$ENV:USERNAME in SCCM Powershell scriptSCCM Powershell 脚本中的 $ENV:USERNAME
【发布时间】:2017-01-19 12:30:42
【问题描述】:

好的,我在这里看到了关于这个问题的答案,但我不明白,下一步是什么。 The original question 如果我想让这条线工作,我该怎么办

$from = "$dirFiles\config.xml"
$to = "C:\Users\$env:USERNAME\AppData\Roaming\Folder\Folder\config.xml"
Copy-Item $from $to -recurse

因为 $env:username 在通过 SCCM 部署时解析为我的计算机名称。我应该如何以及在哪里输入:

([Security.Principal.WindowsIdentity]::GetCurrent()).Name.replace("$ENV:USERDOMAIN\","")

希望你能理解我

edit** 感谢 bluuf 和 Syberdoor,他们为我指明了正确的方向

**$CurrentUser = (Get-LoggedOnUser).UserName**
$from = "$dirFiles\config.xml"
$to = "C:\Users\$CurrentUser\AppData\Roaming\Folder\Folder\config.xml"
Copy-Item $from $to -recurse

【问题讨论】:

  • 我肯定不知道,你想达到什么目的?
  • 我正在尝试让 powershell 和 SCCM 将文件复制到运行安装程序的计算机上的 Appdata 用户文件夹中。但我收到文件夹 C:\Users\"Computername"\ 不存在的错误。所以 SCCM 或 powershell 将 $env:USERNAME 变量解析为计算机名而不是登录的用户名。
  • 所以显而易见的问题是,如果没有人登录,您如何期望它是用户名?您希望获得哪个用户?
  • 部署设置为仅在用户登录时安装,所以我希望获得登录用户名

标签: powershell environment-variables administrator sccm non-admin


【解决方案1】:

默认情况下,SCCM 程序使用当前计算机的 SYSTEM 帐户执行。

如果这是来自包/程序模型的程序,您必须在程序的属性中进行更改,然后转到“环境”选择“程序可以运行:仅当用户登录时”和“以用户权限运行”也可以转到“高级”并选择“当此程序分配给计算机时:为每个登录的用户运行一次”

如果它是一种应用程序类型,您必须转到部署类型的属性和“用户体验”,然后将“安装行为”更改为“为用户安装”。

这将是 SCCM 内部方法来执行您想要的操作。当然,这也意味着您将失去所有管理员权限和访问权限,因为上下文现在是登录用户的。访问用户配置文件应该没有问题(更好的环境变量是 $env:appdata btw),但您还需要为每个用户读取 $dirFiles。

另一种方法(如果只对所有计算机执行一次)将保留管理员权限,而不是使用环境变量获取所有用户,例如“gci C:\users”(减去公共配置文件) 然后用管理员一次替换所有用户文件。

【讨论】:

  • 所以基本上这是不可能的,除非我给用户管理员权限
  • 我的猜测是你在处理这个问题时采取了错误的方法。即使从系统帐户也有多种方法可以获取当前登录的用户名(例如 wmi 类 win32_computersystem)。遍历 c:\users 文件夹并检查文件或文件夹上的特定活动也是可能的。一条通往死胡同的路并不意味着不可能:它只是意味着你必须走另一条路(绕道或走捷径)。
  • 我认为您不需要管理员权限来覆盖用户配置文件中的文件。用户拥有这些文件,权限应该足够。您需要的是对 $dirFiles 的访问权限,如果没有提供这些权限,您可能可以使用分发点为您解决此问题。 @bluuf(以及我在最后一段中)所说的也是正确的,管理员可以访问其他用户,但这在很大程度上取决于您的设置是否有意义。最后,您是否知道使用 GPP 可以轻松地为每个用户复制一个文件(具有管理员权限)?
  • 当然 :) 这与管理员权限无关,我的头在那里不正确。
  • (Get-LoggedOnUser).UserName解决了$CurrentUser = (Get-LoggedOnUser).UserName能够使用正确用户登录的问题
【解决方案2】:

我正在尝试回答您提出的原始问题:您可以创建自己的变量来替换 $env:username。例如下面我使用 $uu:

$from = "$dirFiles\config.xml"
$uu = (([Security.Principal.WindowsIdentity]::GetCurrent().Name) -split "\\")[1]
$to = "C:\Users\$uu\AppData\Roaming\Folder\Folder\config.xml"
Copy-Item $from $to -recurse  

【讨论】:

  • 老实说,您的回复对我来说毫无意义(无意发火):发帖人并没有抱怨用户名不起作用;问题是脚本在系统帐户下运行,因此 AD 计算机帐户 - 用户名变量(以及 GetCurrent() 方法)将包含 AD 用户帐户,因为这是运行脚本的用户帐户。
猜你喜欢
  • 2019-02-17
  • 2017-12-10
  • 1970-01-01
  • 1970-01-01
  • 2017-02-23
  • 1970-01-01
  • 2014-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多