[gptalk] GetGPOList Function Doesn't Return a Correct "Security Group Vetted" List of GPOs - What?

  • From: "Cruz, Jerome L" <jerome.l.cruz@xxxxxxxxxx>
  • To: "gptalk@xxxxxxxxxxxxx" <gptalk@xxxxxxxxxxxxx>
  • Date: Fri, 22 Aug 2008 15:08:31 -0700

We have a self coded service that allows our remote devices to run their 
GPO-targeted Computer Startup scripts 'after' connecting to the corporate 
network via VPN. In updating the home-grown code recently (to support an 
upcoming release of Vista), we were asked to add one new feature by one of our 
GPO Administrators:

"Have the service only run the scripts in GPOs applicable to the device. [Okay, 
we thought we were doing this. - JC]  That is, the device should not get the 
GPO Computer Startup script when it is a member of a domain security group 
listed on the GPOs Delegation tab with the following properties: 'Allow-Read' 
and 'Deny-Apply Group Policy'." [ And we thought this was the case as well. - 
JC] Because it currently doesn't do this, I have to create separate OUs just to 
get our Computer Startup scripts correctly targeted. [Ouch, what's up here? - 
JC]

We have been running this code on 150,000+ systems since 2001 and, until now, 
no one has ever indicated that the list being returned was not the 'absolutely 
correct' list of GPOs. The service runs under Local System and uses the 
GetGPOList function (with the lpName and lpHostName parameters) to retrieve the 
list of GPOs for the computer.

Has anyone run into this situation before, specifically that using the lpName 
and lpHostName parameters, instead of the hToken parameter in the GetGPOList 
function returns an incorrect list of GPOs?

Also, if I ask the developer to switch to using the hToken parameter, which 
function might be the best to get hToken from [available functions from the 
article noted below are 
LogonUser<http://msdn.microsoft.com/en-us/library/cc447468(VS.85).aspx>, 
CreateRestrictedToken<http://msdn.microsoft.com/en-us/library/cc402001(VS.85).aspx>,
 DuplicateToken<http://msdn.microsoft.com/en-us/library/cc402013(VS.85).aspx>, 
OpenProcessToken<http://msdn.microsoft.com/en-us/library/cc447514(VS.85).aspx>, 
or 
OpenThreadToken<http://msdn.microsoft.com/en-us/library/cc447517(VS.85).aspx>] 
considering the remote nature of the device when connected via VPN?

MSDN link to GetGPOList
http://msdn.microsoft.com/en-us/library/aa373520(VS.85).aspx
...
The GetGPOList function is intended for use by services acting on behalf of a 
user or computer. The service calls this function to obtain a list of GPOs, 
then checks each GPO for service-specific policy. Calling this function with a 
token provides the most accurate list. The system can perform access checking 
for the user or computer. Calling this function with the user or computer name 
and the domain controller name is faster than calling it with a token. However, 
if the token is not specified, the system uses the security access of the 
caller, which means that the list may not be completely correct for the 
intended user or computer.

====================================================================
More (too much) Info  :)
====================================================================
 When I tested this out for the GPO Administrators, their statement (and 
experience) was correct.

The Test: I added a test machine account to a domain-side security group, added 
that security group to a standard GPO (that runs a Computer Startup script) and 
set the groups rights to 'Allow-Read' and 'Deny-Apply Group Policy'. I rebooted 
the device twice, verified it knew that it was a member of the group and 
validated that the GPO was no longer running the script. I unplugged the 
network cable, rebooted it, and then plugged in a non-company LAN line. Then I 
established a VPN session. Sure enough the service thought that the GPO 'was' 
still applicable and ran the script.

In researching this, their GPO typically has the Authenticated User group with 
'Allow-Read' and 'Allow-Apply Group Policy' permissions along with a second 
security group used to filter out certain machine accounts using 'Allow-Read' 
and 'Deny-Apply Group Policy'. Since we created the code in 2001, we cannot be 
sure that the text about GetGPOList not returning the absolutely correct list 
(above in red) was there at the time we were first working with it. However, it 
is there now and we have to deal with it.

Jerry Cruz

Other related posts:

  • » [gptalk] GetGPOList Function Doesn't Return a Correct "Security Group Vetted" List of GPOs - What?