2 * __SystemSecurity implementation
4 * Copyright 2014 Vincent Povirk for CodeWeavers
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
30 #include "wine/debug.h"
31 #include "wbemprox_private.h"
33 WINE_DEFAULT_DEBUG_CHANNEL(wbemprox
);
35 static HRESULT
to_byte_array( void *data
, DWORD size
, VARIANT
*var
)
41 if (!(sa
= SafeArrayCreateVector( VT_UI1
, 0, size
))) return E_OUTOFMEMORY
;
43 hr
= SafeArrayAccessData( sa
, &sadata
);
47 memcpy( sadata
, data
, size
);
49 SafeArrayUnaccessData( sa
);
53 SafeArrayDestroy( sa
);
57 set_variant( VT_UI1
|VT_ARRAY
, 0, sa
, var
);
61 static HRESULT
get_sd( SECURITY_DESCRIPTOR
**sd
, DWORD
*size
)
63 BYTE sid_admin_buffer
[SECURITY_MAX_SID_SIZE
];
64 SID
*sid_admin
= (SID
*)sid_admin_buffer
;
65 BYTE sid_network_buffer
[SECURITY_MAX_SID_SIZE
];
66 SID
*sid_network
= (SID
*)sid_network_buffer
;
67 BYTE sid_local_buffer
[SECURITY_MAX_SID_SIZE
];
68 SID
*sid_local
= (SID
*)sid_local_buffer
;
69 BYTE sid_users_buffer
[SECURITY_MAX_SID_SIZE
];
70 SID
*sid_users
= (SID
*)sid_users_buffer
;
71 BYTE acl_buffer
[sizeof(ACL
) + 4 * (sizeof(ACCESS_ALLOWED_ACE
) - sizeof(DWORD
) + SECURITY_MAX_SID_SIZE
)];
72 ACL
*acl
= (ACL
*)acl_buffer
;
74 SECURITY_DESCRIPTOR absolute_sd
;
77 sid_size
= sizeof(sid_admin_buffer
);
78 CreateWellKnownSid( WinBuiltinAdministratorsSid
, NULL
, sid_admin
, &sid_size
);
80 sid_size
= sizeof(sid_network_buffer
);
81 CreateWellKnownSid( WinNetworkServiceSid
, NULL
, sid_network
, &sid_size
);
83 sid_size
= sizeof(sid_local_buffer
);
84 CreateWellKnownSid( WinLocalServiceSid
, NULL
, sid_local
, &sid_size
);
86 sid_size
= sizeof(sid_users_buffer
);
87 CreateWellKnownSid( WinAuthenticatedUserSid
, NULL
, sid_users
, &sid_size
);
89 InitializeAcl( acl
, sizeof(acl_buffer
), ACL_REVISION
);
91 AddAccessAllowedAceEx( acl
, ACL_REVISION
, CONTAINER_INHERIT_ACE
|INHERITED_ACE
,
92 ADS_RIGHT_DS_CREATE_CHILD
|ADS_RIGHT_DS_DELETE_CHILD
|ADS_RIGHT_ACTRL_DS_LIST
|ADS_RIGHT_DS_SELF
|
93 ADS_RIGHT_DS_READ_PROP
|ADS_RIGHT_DS_WRITE_PROP
|READ_CONTROL
|WRITE_DAC
,
96 AddAccessAllowedAceEx( acl
, ACL_REVISION
, CONTAINER_INHERIT_ACE
|INHERITED_ACE
,
97 ADS_RIGHT_DS_CREATE_CHILD
|ADS_RIGHT_DS_DELETE_CHILD
|ADS_RIGHT_DS_READ_PROP
,
100 AddAccessAllowedAceEx( acl
, ACL_REVISION
, CONTAINER_INHERIT_ACE
|INHERITED_ACE
,
101 ADS_RIGHT_DS_CREATE_CHILD
|ADS_RIGHT_DS_DELETE_CHILD
|ADS_RIGHT_DS_READ_PROP
,
104 AddAccessAllowedAceEx( acl
, ACL_REVISION
, CONTAINER_INHERIT_ACE
|INHERITED_ACE
,
105 ADS_RIGHT_DS_CREATE_CHILD
|ADS_RIGHT_DS_DELETE_CHILD
|ADS_RIGHT_DS_READ_PROP
,
108 InitializeSecurityDescriptor( &absolute_sd
, SECURITY_DESCRIPTOR_REVISION
);
110 SetSecurityDescriptorOwner( &absolute_sd
, sid_admin
, TRUE
);
111 SetSecurityDescriptorGroup( &absolute_sd
, sid_admin
, TRUE
);
112 SetSecurityDescriptorDacl( &absolute_sd
, TRUE
, acl
, TRUE
);
114 *size
= GetSecurityDescriptorLength( &absolute_sd
);
116 *sd
= HeapAlloc( GetProcessHeap(), 0, *size
);
122 if (!MakeSelfRelativeSD(&absolute_sd
, *sd
, size
))
124 HeapFree( GetProcessHeap(), 0, *sd
);
133 HRESULT
security_get_sd( IWbemClassObject
*obj
, IWbemContext
*context
, IWbemClassObject
*in
, IWbemClassObject
**out
)
135 VARIANT var_sd
, retval
;
136 IWbemClassObject
*sig
, *out_params
= NULL
;
138 SECURITY_DESCRIPTOR
*sd
;
141 TRACE("%p, %p, %p, %p\n", obj
, context
, in
, out
);
143 hr
= create_signature( L
"__SystemSecurity", L
"GetSD", PARAM_OUT
, &sig
);
147 hr
= IWbemClassObject_SpawnInstance( sig
, 0, &out_params
);
149 IWbemClassObject_Release( sig
);
154 ret
= get_sd( &sd
, &sd_size
);
158 VariantInit( &var_sd
);
160 hr
= to_byte_array( sd
, sd_size
, &var_sd
);
163 hr
= IWbemClassObject_Put( out_params
, L
"SD", 0, &var_sd
, CIM_UINT8
|CIM_FLAG_ARRAY
);
165 HeapFree( GetProcessHeap(), 0, sd
);
166 VariantClear( &var_sd
);
171 set_variant( VT_UI4
, ret
, NULL
, &retval
);
172 hr
= IWbemClassObject_Put( out_params
, L
"ReturnValue", 0, &retval
, CIM_UINT32
);
175 if (SUCCEEDED(hr
) && out
)
178 IWbemClassObject_AddRef( out_params
);
181 IWbemClassObject_Release( out_params
);
188 HRESULT
security_set_sd( IWbemClassObject
*obj
, IWbemContext
*context
, IWbemClassObject
*in
, IWbemClassObject
**out
)
191 IWbemClassObject
*sig
, *out_params
= NULL
;
196 hr
= create_signature( L
"__SystemSecurity", L
"SetSD", PARAM_OUT
, &sig
);
200 hr
= IWbemClassObject_SpawnInstance( sig
, 0, &out_params
);
202 IWbemClassObject_Release( sig
);
207 set_variant( VT_UI4
, S_OK
, NULL
, &retval
);
208 hr
= IWbemClassObject_Put( out_params
, L
"ReturnValue", 0, &retval
, CIM_UINT32
);
210 if (SUCCEEDED(hr
) && out
)
213 IWbemClassObject_AddRef( out_params
);
216 IWbemClassObject_Release( out_params
);