ConvertStringSecurityDescriptorToSecurityDescriptor

ConvertStringSecurityDescriptorToSecurityDescriptor 函数

ConvertStringSecurityDescriptorToSecurityDescriptor 函数将一个字符串格式 安全描述符 转换为一个有效的、 功能的安全描述符。 此函数检索 ConvertSecurityDescriptorToStringSecurityDescriptor 功能转换为字符串格式的安全描述符。

语法

C++

BOOL WINAPI ConvertStringSecurityDescriptorToSecurityDescriptor (__in LPCTSTR  StringSecurityDescriptor DWORD  StringSDRevision __out PSECURITY_DESCRIPTOR __in *  SecurityDescriptor __out PULONG  SecurityDescriptorSize )

参数

StringSecurityDescriptor []

指向一个空结尾的字符串包含要转换的 字符串格式安全描述符 的指针。

StringSDRevision []

指定 StringSecurityDescriptor 字符串的修订级别。 当前,此值必须 SDDL_REVISION_1

SecurityDescriptor [out]

指向一个变量,接收转换后的安全描述符的指针的指针。 返回的安全描述符是 自相关联 要释放返回的缓冲区,调用 LocalFree 函数。 若要将安全描述符转换为一个 绝对安全描述符 中,使用 MakeAbsoluteSD 功能。

SecurityDescriptorSize [out]

指向一个变量,接收该的大小以字节为单位的转换后的安全描述符的指针。 此参数可以是 NULL

返回值

如果该函数成功,返回值是,则返回非零值。

如果函数失败,返回值是零。 若要获取扩展的错误的信息,请调用 GetLastError GetLastError 可能会返回以下错误代码之一。

返回代码

描述

ERROR_INVALID_PARAMETER

参数不是有效的。

ERROR_UNKNOWN_REVISION

SDDL 修订级别无效。

ERROR_NONE_MAPPED

一个 安全标识符 (SID 输入的安全描述符字符串中) 找不到一个帐户查找操作。

 

在C++ Windows服务中,使用CreateProcessAsUser函数启动另一个进程,并指定Local System权限,可以通过以下步骤实现: 1. 获取Local System用户的访问令牌。使用OpenProcessToken函数获取当前进程的访问令牌,然后使用DuplicateTokenEx函数创建一个访问令牌的副本。在DuplicateTokenEx函数中指定TokenPrimary参数,以便创建一个主访问令牌,这样后续可以使用该访问令牌来启动新进程。 ```c++ HANDLE hToken = NULL; if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken)) { // 获取当前进程的访问令牌失败 // TODO:处理错误 return; } HANDLE hTokenDup = NULL; if (!DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS, NULL, SecurityImpersonation, TokenPrimary, &hTokenDup)) { // 创建访问令牌的副本失败 // TODO:处理错误 CloseHandle(hToken); return; } CloseHandle(hToken); ``` 2. 设置访问令牌的安全属性。使用SetTokenInformation函数设置TOKEN_MANDATORY_LABEL信息,以便指定访问令牌的安全属性。 ```c++ // 设置SDDL字符串,表示为Local System用户创建一个低完整性级别的安全标签 LPCTSTR szSDDL = _T("S-1-16-4096"); PSECURITY_DESCRIPTOR pSD = NULL; if (!ConvertStringSecurityDescriptorToSecurityDescriptor(szSDDL, SDDL_REVISION_1, &pSD, NULL)) { // 转换SDDL字符串为安全描述符失败 // TODO:处理错误 CloseHandle(hTokenDup); return; } TOKEN_MANDATORY_LABEL tml = { 0 }; tml.Label.Attributes = SE_GROUP_INTEGRITY; tml.Label.Sid = NULL; if (!ConvertStringSidToSid(szSDDL, &(tml.Label.Sid))) { // 转换SDDL字符串为SID失败 // TODO:处理错误 CloseHandle(hTokenDup); LocalFree(pSD); return; } if (!SetTokenInformation(hTokenDup, TokenIntegrityLevel, &tml, sizeof(TOKEN_MANDATORY_LABEL) + GetLengthSid(tml.Label.Sid))) { // 设置访问令牌的安全属性失败 // TODO:处理错误 CloseHandle(hTokenDup); LocalFree(pSD); return; } LocalFree(pSD); ``` 3. 使用CreateProcessAsUser函数创建一个新进程,并使用访问令牌的副本来启动该进程。在CreateProcessAsUser函数中指定CREATE_NEW_CONSOLE标志,以便在新控制台窗口中启动新进程。 ```c++ STARTUPINFO si = { 0 }; si.cb = sizeof(si); si.lpDesktop = _T("winsta0\\default"); PROCESS_INFORMATION pi = { 0 }; if (!CreateProcessAsUser(hTokenDup, NULL, _T("cmd.exe"), NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi)) { // 使用访问令牌启动新进程失败 // TODO:处理错误 CloseHandle(hTokenDup); return; } ``` 4. 关闭访问令牌的副本和新进程的句柄。 ```c++ CloseHandle(pi.hThread); CloseHandle(pi.hProcess); CloseHandle(hTokenDup); ``` 希望这些步骤能够帮助您在C++ Windows服务中使用CreateProcessAsUser函数启动另一个进程,并指定Local System权限。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值