.net 获取当前用户的SID的最佳方法是什么?

lf5gs5x2  于 2023-05-23  发布在  .NET
关注(0)|答案(4)|浏览(182)

前置条件详情

1.使用.NET 2.0。
1.代码位于一个公共库中,可以从ASP.NET、Windows窗体或控制台应用程序调用该库。
1.在企业网络上的Windows域中运行。

问题

获取当前用户的SID的最佳方法是什么?我说的不是执行应用程序的标识,而是访问接口的用户。在后台应用程序和基于桌面的应用程序中,这应该是实际执行应用程序的标识,但在ASP.NET中(没有命令),这应该是HttpContext.Current.UserSID。

当前方法

这就是我现在所拥有的。只是看起来...不对。很恶心。有没有更好的方法来做到这一点,或者一些内置的类,为您做?

public static SecurityIdentifier SID
{
    get
    {
        WindowsIdentity identity = null;

        if (HttpContext.Current == null)
        {
            identity = WindowsIdentity.GetCurrent();
        }
        else
        {
            identity = HttpContext.Current.User.Identity as WindowsIdentity;
        }

        return identity.User;
    }
}
byqmnocz

byqmnocz1#

我不认为有更好的方法来获取这些信息--你必须以某种方式获取WindowsPrincipal和.NET的相当干净的API抽象,它隐藏在User对象后面。我只需要把它放在一个方法中,然后就结束了。
好吧,好吧,有一件事你应该做(除非你的网络用户总是要WindowsIdentity),这将是检查空身份,并根据任何规则处理它。

kcwpcxri

kcwpcxri2#

如果用户更改了用户名,则不使用第三方库,此代码将给予正确的结果。

String SID = "";
string currentUserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name.ToString();

RegistryKey regDir = Registry.LocalMachine;

            using (RegistryKey regKey = regDir.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\SessionData", true))
            {
                if (regKey != null)
                {
                    string[] valueNames = regKey.GetSubKeyNames();
                    for (int i = 0; i < valueNames.Length; i++)
                    {
                        using (RegistryKey key = regKey.OpenSubKey(valueNames[i], true))
                        {
                            string[] names = key.GetValueNames();
                            for (int e = 0; e < names.Length; e++)
                            {
                                if (names[e] == "LoggedOnSAMUser")
                                {
                                    if (key.GetValue(names[e]).ToString() == currentUserName)
                                        SID = key.GetValue("LoggedOnUserSID").ToString();
                                }
                            }
                        }
                    }
                }
            }MessageBox.Show(SID);
djp7away

djp7away3#

返回当前用户:

WindowsIdentity.GetCurrent().Owner

以SDDL格式返回安全标识符(SID),即***S-1-5-9***:

WindowsIdentity.GetCurrent().Owner.ToString()

返回帐户域安全标识符(SID)如果SID不表示Windows帐户SID,则此属性返回null:

WindowsIdentity.GetCurrent().Owner.AccountDomainSid

您可以将其用作:

_pipeSecurity = new PipeSecurity();   
               
var sid = new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, WindowsIdentity.GetCurrent().Owner);
var audid = new PipeAuditRule(sid, PipeAccessRights.FullControl, AuditFlags.Failure | AuditFlags.Success);
var access = new PipeAccessRule(sid, PipeAccessRights.ReadWrite, AccessControlType.Allow);
            
_pipeSecurity.AddAuditRule(audid);
_pipeSecurity.AddAccessRule(access);
vc6uscn9

vc6uscn94#

WindowsIdentity类是“为您做这件事的内置类”。只要有一个有效的WindowsIdentity,你就可以得到一个简单的解决方案。
或者,如果您有问题用户的用户名,并且希望直接从AD获取SID,则可以构建自己的库来使用DirectoryServices命名空间并检索用户的DirectoryEntry(这是一个相当复杂的过程,因为DirectoryServices很棘手)。如果有需要,您甚至可以使用LDAP来获取它。

相关问题