PowerShell登录脚本作为管理员

时间:2018-05-16 19:15:12

标签: powershell active-directory gpo

我有一个PowerShell脚本,我需要在用户登录时运行。 该脚本使用AD模块查看用户是否属于某个组并获取其他信息,此外我还获得了以下局部变量:

*do something2*

这就是为什么我需要它在登录时运行,但我认为这是一个权限问题。

知道我怎么能这样做?我尝试在用户配置→策略→Windows设置→脚本→登录下添加脚本,但它不起作用,也在计算机配置下尝试。

添加了$env:DOMAINNAME $env:USERNAME $env:APPDATA $env:TEMP 作为参数,但仍然没有。

我还尝试添加is作为计划任务并以其他用户身份运行但仍然没有运气。

1 个答案:

答案 0 :(得分:0)

由于您在其他评论中共享了代码,因此我可以对您尝试实现的内容做出一些假设,并对此提供帮助。所以让我们分解它。

ActiveDirectory模块

我们需要做的第一件事是删除对ActiveDirectory模块的依赖。正如这里的一些评论所解释的,ActiveDirectory模块是RSAT套件的内置组件。当此脚本在您的客户端计算机上运行时,这将无法使用,我们也不希望它可用,因为它会产生大量的依赖性开销并向您的用户公开管理实用程序。

您使用的cmdlet只是Get-ADUserGet-ADGroupGet-ADPrincipalGroupMembership。这些是使用轻量级目录访问协议(LDAP)的搜索cmdlet,因此我们可以使用.NET类将它们替换为我们自己的搜索功能。

GET-ADUser便有

我们可以将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

我们还需要替换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}
    }
}

GET-ADPrincipalGroupMembership

此cmdlet不需要更换 - 不是因为它可以自行更换,而是因为您不需要它来实现所需的最终结果。您已使用它从AD用户检索组成员身份,但AD用户有一个附加到其AD用户对象的成员身份列表。实质上,我们可以直接从AD用户对象获取AD用户的成员列表,我们将这样做:

$userObject = Get-ADUser -Identity $env:USERNAME
$objGroup = $userObject.memberOf

此时您会注意到,结果集不是组名,而是它们的专有名称。这也只是这些专有名称的字符串数组,您必须对代码的其他代码运算符进行一些修改,以便过滤此组列表。

部署代码

我们需要关注的第二件事是您如何部署此代码。有许多方法可以实现这一点,但我们假设您能够将脚本部署到最终用户并假设它运行。

上下文

用于部署此代码的方法需要与代码本身保持一致。如果您的脚本对其运行的上下文进行了假设(例如使用$env:USERNAME来收集用户的AD的SAMAccountName),那么您需要确保部署方法将此假设作为好。现在的脚本正在做出这样的假设 - 假设它是用户自己运行此代码的上下文。

为了支持这一假设,我们需要确保部署方法将以用户的身份运行脚本

依赖关系

现在我们知道代码在用户机器上的用户自己的上下文中运行,并且我们知道代码访问外部资源,例如Active Directory,我们需要确保用户具有代码具有这些依赖关系的权限,以确保代码可以正常工作。

确保查看代码并列出代码执行的所有任务。通过这种方式,我的意思是注意代码将读取用户自己的AD对象,它将读取网络位置以访问签名文件,它将阅读& 到用户自己的注册表,以及到用户的appdata路径。

结论

通过验证这些依赖项,并使用与代码排列的部署方法,您应该拥有自己的工作产品。你的代码表明你需要了解很多关于Powershell的内容,但是如果你坚持下去并磨练你对基础知识的理解,你就可以了。继续学习,不断破坏,并始终记得在此过程中获得乐趣。