设置服务访问规则
Set Service Access Rules
我希望能够执行sc sdset $serviceName $accessString
以允许特定用户停止和启动服务,另请参阅此问题。但是我希望在没有命令行的情况下使用c ++来代替Windows API。
我已经得到了一个安全描述符和安全信息。我现在失败的地方是将此新规则添加到服务中。我找到了这个资源,但我不清楚如何将我的安全描述符转换为与 SetEntriesInAcl(( 一起使用的EXPLICIT_ACCESS结构。
这里的主要问题 - 如何决定 - 哪个帐户 (SID( 必须具有权限。 如果需要允许NetworkService
启动/停止/暂停本身 - 它需要SERVICE_START
,SERVICE_STOP
,SERVICE_PAUSE_CONTINUE
- 所以实际上GENERIC_EXECUTE
如果查看服务安全性和访问权限
例如,我们可以设计下一个DACL:
-
面向本地系统和
管理员的
GENERIC_ALL
-
GENERIC_READ
人 -
网络服务
GENERIC_READ | GENERIC_EXECUTE
--
#include <sddl.h>
ULONG afe(PCWSTR lpServiceName)
{
ULONG err = 0;
if (SC_HANDLE hSCManager = OpenSCManagerW(0, 0, 0))
{
if (SC_HANDLE hService = OpenService(hSCManager, lpServiceName, WRITE_DAC))
{
PSECURITY_DESCRIPTOR SecurityDescriptor;
if (ConvertStringSecurityDescriptorToSecurityDescriptorW(
L"D:(A;;GA;;;SY)" // SDDL_LOCAL_SYSTEM -> SDDL_GENERIC_ALL
L"(A;;GA;;;BA)" // SDDL_BUILTIN_ADMINISTRATORS -> SDDL_GENERIC_ALL
L"(A;;GR;;;WD)" // SDDL_EVERYONE -> SDDL_GENERIC_READ
L"(A;;GRGX;;;NS)", // SDDL_NETWORK_SERVICE -> SDDL_GENERIC_READ|SDDL_GENERIC_EXECUTE
SDDL_REVISION_1, &SecurityDescriptor, 0))
{
if (!SetServiceObjectSecurity(hService, DACL_SECURITY_INFORMATION, SecurityDescriptor))
{
err = GetLastError();
}
LocalFree(SecurityDescriptor);
}
else
{
err = GetLastError();
}
CloseServiceHandle(hService);
}
else
{
err = GetLastError();
}
CloseServiceHandle(hSCManager);
}
else
{
err = GetLastError();
}
return err;
}
相关文章:
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 用于访问容器<T>数据成员的正确 API
- 访问者访问变体并返回不同类型时出错
- 尝试通过多个向量访问变量时,向量下标超出范围
- 无法访问嵌套类.类的使用无效
- 写入位置0x0000000C时发生访问冲突
- 此代码是否违反一个定义规则
- 我们可以访问一个不存在的联盟的成员吗
- 这是关于成员访问规则的正确摘要吗
- 设置服务访问规则
- 在不违反严格的别名规则的情况下访问进程间共享内存中的对象
- 使用“alias()”解析精神规则时访问冲突
- 该"Named Constructor Idiom"似乎与静态方法无法访问非静态成员函数的规则相矛盾。有什么解释吗?
- as-if规则是否防止编译器对全局/成员变量的访问重新排序
- 如何在不违反严格的混叠规则的情况下访问内存映射的多字节寄存器
- 文件范围和访问规则
- 允许"this->"访问依赖基类成员的规则是什么?
- 一个关于类成员访问表达式的定义规则