如何通过 Microsoft.Web.Administration 查找应用池的 SID

本文关键字:应用 SID 查找 Administration 何通过 Microsoft Web | 更新日期: 2023-09-27 18:07:00

我正在开发一个配置工具,该工具需要根据运行特定 Web 应用程序的身份对目录设置一些权限。 原始代码只是基于IIS APPPOOL'<ApppoolName>或基于众所周知的 SID 构建登录名(如果它是内置帐户(。

一些类似的代码在本地化环境中失败,所以我现在正在尝试摆脱烘焙的字符串。

我的解决方案是这样的:

public static SecurityIdentifier GetApplicationPoolSid(string name)
    {
        ApplicationPool pool = Manager.ApplicationPools[name];
        if (pool != null)
        {
            var sddlForm = pool.GetAttributeValue("applicationPoolSid") as string;
            if (!String.IsNullOrEmpty(sddlForm))
                return new SecurityIdentifier(sddlForm);
        }
        return null;
    }

问题是我通过在调试器中四处寻找发现了"applicationPoolSid",并且我找不到任何文档表明我没有利用将来会消失的未记录的实现功能。 (这意味着它不会通过代码审查。

我很想知道我在这里看到的批准方式。 我也很高兴知道IIS APPPOOL'<ApppoolName>保证永远不会本地化,这样我们就可以回到旧的方式。

如何通过 Microsoft.Web.Administration 查找应用池的 SID

我找不到IIS APPPOOL本地化的参考,这是有道理的,因为IIS和APPPOOL都不是任何语言的单词,所以没有什么可以翻译的。虽然它们是英语和其他语言的首字母缩略词,但我认为即使在其他语言中它们仍然被称为 IIS 和 AppPool。

顺便说一下,您可以像这样正式获得SID

NTAccount f = new NTAccount(@"IIS AppPool'DefaultAppPool");
SecurityIdentifier s = (SecurityIdentifier)f.Translate(typeof(SecurityIdentifier));
String sidString = s.ToString();

如果要将其传递给FileSystemAccessRule(),您甚至不需要SID,因为它具有需要IdentityReference的过载,NTAccount是。 只需将其传递NTAccount.

这将为你提供SID,但不使用你询问的函数,并且是用powershell而不是C#编写的。我发布此内容是为了希望有助于在使用 SHA1 生成方面走上正确的轨道,而不是从 Windows 实际查询。此外,某些系统没有安装某些 SID 和用户帐户模块,因此可以在这些情况下使用。

基于应用池用户名生成 SID 的函数(底部链接中的说明(

function Get-SID ([String]$winver, [String]$username) {
    $sidPrefix = switch ($winver) {
        '6.0' { 'S-1-5-80' }
        default { 'S-1-5-82' }
    }
    $userToString = switch ( $sidPrefix ) {
        'S-1-5-82' { $username.ToLower() }
        default { $username.ToUpper() }
    }
    $userBytes = [Text.Encoding]::Unicode.GetBytes($userToString)
    $sha = New-Object System.Security.Cryptography.SHA1CryptoServiceProvider
    $hash = $sha.ComputeHash($userBytes)
    $sid = $sidPrefix
    for ( $i=0; $i -lt 5; $i++ ) {
        $sid += '-' + [BitConverter]::ToUInt32($hash, $i*4)
    }
    return $sid
}

示例用法

Get-SID -winver "6.0" -username "DefaultAppPool"

用户 6.0 用于 Vista 或同等版本,之后使用 6.1/6.2 等。

Powershell的部分功劳归功于 winterdom.com 的Tomas Restrepo,尽管该脚本实际上不起作用,因为某些函数未包含在代码中。