我有一个PowerShell脚本,我需要在用户登录时运行。 该脚本使用AD模块查看用户是否属于某个组并获取其他信息,此外我还获得了以下局部变量:
*do something2*
这就是为什么我需要它在登录时运行,但我认为这是一个权限问题。
知道我怎么能这样做?我尝试在用户配置→策略→Windows设置→脚本→登录下添加脚本,但它不起作用,也在计算机配置下尝试。
添加了$env:DOMAINNAME
$env:USERNAME
$env:APPDATA
$env:TEMP
作为参数,但仍然没有。
我还尝试添加is作为计划任务并以其他用户身份运行但仍然没有运气。
答案 0 :(得分:0)
由于您在其他评论中共享了代码,因此我可以对您尝试实现的内容做出一些假设,并对此提供帮助。所以让我们分解它。
我们需要做的第一件事是删除对ActiveDirectory模块的依赖。正如这里的一些评论所解释的,ActiveDirectory模块是RSAT套件的内置组件。当此脚本在您的客户端计算机上运行时,这将无法使用,我们也不希望它可用,因为它会产生大量的依赖性开销并向您的用户公开管理实用程序。
您使用的cmdlet只是Get-ADUser
,Get-ADGroup
和Get-ADPrincipalGroupMembership
。这些是使用轻量级目录访问协议(LDAP)的搜索cmdlet,因此我们可以使用.NET类将它们替换为我们自己的搜索功能。
我们可以将Get-ADUser
搜索cmdlet替换为我们在运行时定义的函数,如下所示:
function Get-ADUser
{
Param ( [string]$Identity = $null )
IF ($Identity)
{
$UserSearcher = New-Object DirectoryServices.DirectorySearcher
$UserSearcher.SearchRoot = "LDAP://$("DC=$(($ENV:USERDNSDOMAIN).Replace(".",",DC="))")"
$UserSearcher.Filter = "(&(objectCategory=person)(SAMAccountName=$Identity))"
$UserSearcher.FindAll() | foreach {New-Object PSObject -Property:$_.Properties}
}
}
我们还需要替换Get-ADGroup
cmdlet,以便我们可以抓取您在$OfficeLocations
列表中指定的AD群组。
function Get-ADGroup
{
Param ( [string]$Identity = $null )
IF ($Identity)
{
$GroupSearcher = New-Object DirectoryServices.DirectorySearcher
$GroupSearcher.SearchRoot = "LDAP://$("DC=$(($ENV:USERDNSDOMAIN).Replace(".",",DC="))")"
$GroupSearcher.Filter = "(&(objectCategory=group)(SAMAccountName=$Identity))"
$GroupSearcher.FindAll() | foreach {New-Object PSObject -Property:$_.Properties}
}
}
此cmdlet不需要更换 - 不是因为它可以自行更换,而是因为您不需要它来实现所需的最终结果。您已使用它从AD用户检索组成员身份,但AD用户有一个附加到其AD用户对象的成员身份列表。实质上,我们可以直接从AD用户对象获取AD用户的成员列表,我们将这样做:
$userObject = Get-ADUser -Identity $env:USERNAME
$objGroup = $userObject.memberOf
此时您会注意到,结果集不是组名,而是它们的专有名称。这也只是这些专有名称的字符串数组,您必须对代码的其他代码运算符进行一些修改,以便过滤此组列表。
我们需要关注的第二件事是您如何部署此代码。有许多方法可以实现这一点,但我们假设您能够将脚本部署到最终用户并假设它运行。
用于部署此代码的方法需要与代码本身保持一致。如果您的脚本对其运行的上下文进行了假设(例如使用$env:USERNAME
来收集用户的AD的SAMAccountName),那么您需要确保部署方法将此假设作为好。现在的脚本正在做出这样的假设 - 假设它是用户自己运行此代码的上下文。
为了支持这一假设,我们需要确保部署方法将以用户的身份运行脚本。
现在我们知道代码在用户机器上的用户自己的上下文中运行,并且我们知道代码访问外部资源,例如Active Directory,我们需要确保用户具有代码具有这些依赖关系的权限,以确保代码可以正常工作。
确保查看代码并列出代码执行的所有任务。通过这种方式,我的意思是注意代码将读取用户自己的AD对象,它将读取网络位置以访问签名文件,它将阅读& 写到用户自己的注册表,以及写到用户的appdata路径。
通过验证这些依赖项,并使用与代码排列的部署方法,您应该拥有自己的工作产品。你的代码表明你需要了解很多关于Powershell的内容,但是如果你坚持下去并磨练你对基础知识的理解,你就可以了。继续学习,不断破坏,并始终记得在此过程中获得乐趣。