我在windowsPrincipal.getIdentity().getSid()中将用户的SID设置为byte [].如何从SID获取活动目录条目(DirectoryEntry)?
我正在寻找一种使用Delphi代码提取计算机SID的方法.SysInternals有一个名为PsGetSid的工具可以做到这一点,但我不能在我的应用程序中使用它.我在Google上搜索了一个代码示例,找不到一个.
我怎样才能在Delphi中实现这一目标?
请帮忙.
我需要在C#中获取机器SID(不是计算机帐户的SID).计算机被指定为主机名,它不一定是本地计算机,它可以是域计算机或工作组计算机.我使用这个帮助器类来调用LookupAccountName API函数:
private static class Helper
{
internal enum SID_NAME_USE
{
SidTypeUser = 1,
SidTypeGroup,
SidTypeDomain,
SidTypeAlias,
SidTypeWellKnownGroup,
SidTypeDeletedAccount,
SidTypeInvalid,
SidTypeUnknown,
SidTypeComputer
}
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool LookupAccountName(
string systemName,
string accountName,
byte[] sid,
ref int sidLen,
System.Text.StringBuilder domainName,
ref int domainNameLen,
out SID_NAME_USE peUse);
public static SecurityIdentifier LookupAccountName(
string systemName,
string accountName,
out string strDomainName,
out SID_NAME_USE accountType)
{
const int ERROR_INSUFFICIENT_BUFFER = 122;
int lSidSize = 0;
int lDomainNameSize = 0; …Run Code Online (Sandbox Code Playgroud) 我正在使用strophe和jquery构建一个基于Web的客户端,我使用openfire作为服务器.几乎所有它的工作,我可以得到名单,发送和接收消息,但当我试图将我的存在从可用性改为xa或dnd或任何其他服务器停止回答,我开始得到404错误POST和无效的SID消息如下:"NetworkError:404 Invalid SID. - http://myurl.com/ ".
我一直在讨论其他主题,这似乎是我的可用证书的问题,但我没有任何明确的证据证明什么是错的.
提前感谢您的帮助.
我在自定义MembershipProvider类中使用Active Directory来验证ASP.NET 2.0 Intranet应用程序中的用户,并将其sid与应用程序的配置文件相关联.
当ActiveDirectoryMembershipProvider被使用时,ProviderUserKey该对象MembershipUser是如下
SecurityIdentifier sid = (SecurityIdentifier)Membership.GetUser().ProviderUserKey;
string sidValue = sid.ToString();
/* sidValue = "S-1-5-21-XXXX-XXXX-XXXX-YY" */
Run Code Online (Sandbox Code Playgroud)
据我了解,它YY是命名空间中的主体(也称为组/域).
使用自定义MembershipProvider时,我可以使用objectSidDirectoryEntry对象的属性获取sid
DirectoryEntry entry = new DirectoryEntry(path, username, password);
SecurityIdentifier sid = new SecurityIdentifier((byte[])entry.Properties["objectSid"].Value, 0);
string sidValue = sid.ToString();
/* sidValue = "S-1-5-21-XXXX-XXXX-XXXX" */
Run Code Online (Sandbox Code Playgroud)
在sidValue这种情况下是相同的,只是它不包含主体YY.
我的问题是双重的
System.DirectoryServices)获取主体?编辑:
做了一些进一步的阅读({1} {2})后,我现在知道如果用户从一个组/域移动到另一个组/域,sid可能会改变.鉴于此,将使用中GUID定义DirectoryEntry Properties["objectGUID"]的更好的选择来唯一识别用户?
我有一个 Windows 服务,当用户在本地或通过终端服务器登录时,它需要访问 HKEY_USERS 下的注册表配置单元。我在 win32_logonsession 上使用 WMI 查询来接收用户登录时的事件,我从该查询中获得的属性之一是 LogonId。为了确定我需要访问哪个注册表配置单元,现在我需要用户的 SID,它用作 HKEY_USERS 下的注册表项名称。
在大多数情况下,我可以通过像这样(在 C# 中)执行 RelatedObjectQuery 来获得它:
RelatedObjectQuery relatedQuery = new RelatedObjectQuery( "associators of {Win32_LogonSession.LogonId='" + logonID + "'} WHERE AssocClass=Win32_LoggedOnUser Role=Dependent" );
Run Code Online (Sandbox Code Playgroud)
其中“logonID”是会话查询中的登录会话 ID。运行相关对象查询通常会给我一个包含我需要的 SID 属性。
我对此有两个问题。首先,也是最重要的一点,RelatedObjectQuery 不会为使用缓存凭据登录、与域断开连接的域用户返回任何结果。其次,我对这个 RelatedObjectQuery 的性能不满意 --- 它可能需要几秒钟才能执行。
这是一个快速而肮脏的命令行程序,我把它放在一起来试验查询。这只是枚举本地机器上的用户,而不是设置接收事件:
using System;
using System.Collections.Generic;
using System.Text;
using System.Management;
namespace EnumUsersTest
{
class Program
{
static void Main( string[] args )
{
ManagementScope scope = new ManagementScope( "\\\\.\\root\\cimv2" );
string queryString = "select * from win32_logonsession"; …Run Code Online (Sandbox Code Playgroud) 使用VB.NET,如何使用Active Directory将sid转换为组名?
例如:我需要获得"group_test"而不是"S-1-5-32-544"
我正在使用的代码是:
Public ReadOnly Property Groups As IdentityReferenceCollection
Get
Dim irc As IdentityReferenceCollection
Dim ir As IdentityReference
irc = WindowsIdentity.GetCurrent().Groups
Dim strGroupName As String
For Each ir In irc
Dim mktGroup As IdentityReference = ir.Translate(GetType(NTAccount))
MsgBox(mktGroup.Value)
Debug.WriteLine(mktGroup.Value)
strGroupName = mktGroup.Value.ToString
Next
Return irc
End Get
End Property
Run Code Online (Sandbox Code Playgroud)
或类似的东西?
currentUser = WindowsIdentity.GetCurrent()
For Each refGroup As IdentityReference In currentUser.Groups
Dim acc As NTAccount = TryCast(refGroup.Translate(GetType(NTAccount)), NTAccount)
If AdminGroupName = acc.Value Then
ret = "999"
End If
If UsersGroupName = …Run Code Online (Sandbox Code Playgroud) session id和 和有什么区别connect.sid?
例如:
console.log('session id =', req.sessionID)
Run Code Online (Sandbox Code Playgroud)
结果:
session id = CCw2pSpdPf8NRKLQpFH-nlFztEzps24Q
Run Code Online (Sandbox Code Playgroud)
和:
console.log('req.headers =', req.headers)
Run Code Online (Sandbox Code Playgroud)
结果:
req.headers = { 20:51:34
host: 'localhost:3000',
connection: 'keep-alive',
'cache-control': 'max-age=0',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 ' +
'(KHTML, like Gecko) Chrome/73.0.3683.75 ' +
'Safari/537.36',
dnt: '1',
accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'en-GB,en-US;q=0.9,en;q=0.8',
cookie: 'connect.sid=s%3ACCw2pSpdPf8NRKLQpFH-nlFztEzps24Q.P04Tx%2FNboFGXvR34HOjpbeh4ogWy58zs%2Bpyde%2FkuUVs',
'if-none-match': 'W/"2f-u+/xADzzu5HL7bySP/YXVKZBlPc"'
}
Run Code Online (Sandbox Code Playgroud)
CCw2pSpdPf8NRKLQpFH-nlFztEzps24Q 不同于 connect.sid
如何在中间件中使用它们来验证用户?
我知道这个问题多次被问过,但没有人回答我的问题.我从Comptiat A +的研究中得知,在使用自动(无人值守)安装时,技术人员必须返回并更改MACHINE SID,然后才能在每台机器上激活操作系统.似乎有很多关于如何通过网络获得SID的问题,但我知道还有一台机器SID无法更改.对于那些使用过Fix-It Utilities启动盘的人来说,有一个按钮"更改SID",如果已经激活,Windows将无法启动.
我的问题与此类似,但他的问题从未真正回答过.我的问题是,如何使用c#获取MACHINE Windows安装SID.
我正在使用Win32 API在C中测试以下代码,该API旨在创建一个新文件,该文件可供当前用户访问,但对其他人来说是私有的(不可访问).
为此,这拒绝所有人SID的权限,然后为当前的用户SID设置权限.
该文件已成功创建,并且权限显然已成功设置(请参阅下面的屏幕截图),但是当我尝试使用记事本打开文件时,它会显示"访问被拒绝"(我的文件浏览器在同一会话下运行),如果我打开命令提示符并执行"输入file_created.txt",则会出现相同的"访问被拒绝".
我当然可以手动恢复权限,因为我是管理员,但我们的想法是让它以编程方式工作.
代码:
#include <windows.h>
#include <AccCtrl.h>
#include <aclapi.h>
#include <stdio.h>
#include <stdexcept>
#include <string>
#undef UNICODE
int GetCurrentUserSid(PSID* pSID)
{
const int MAX_NAME = 256;
DWORD i, dwSize = 0;
HANDLE hToken;
PTOKEN_USER user;
TOKEN_INFORMATION_CLASS TokenClass = TokenUser;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_READ | TOKEN_QUERY, &hToken))
return GetLastError();
else
wprintf(L"OpenProcessToken() - got the handle to the access token!\n");
if (!GetTokenInformation(hToken, TokenClass, NULL, 0, &dwSize))
{
DWORD dwResult = GetLastError();
if (dwResult != ERROR_INSUFFICIENT_BUFFER)
{
wprintf(L"GetTokenInformation() failed, …Run Code Online (Sandbox Code Playgroud)