如何通过Microsoft.Web.Administration找到应用程序池的SID?

时间:2014-06-05 16:18:41

标签: c# iis localization

我正在开发一个配置工具,需要根据特定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>保证永远不会被本地化,所以我们可以回到过去的方式。

2 个答案:

答案 0 :(得分:1)

我找不到对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();

如果您要将SID传递给FileSystemAccessRule(),您甚至不需要IdentityReference,因为它的重载需要NTAccountNTAccount是的。只需将其传递给{{1}}。

答案 1 :(得分:0)

这将为您提供SID,但不使用您所要求的功能,而是使用Powershell而不是C#编写的。我发布此消息是希望能帮助您找到有关使用SHA1进行生成的正确路径,而不是实际从Windows查询。另外,某些系统没有安装某些SID和用户帐户模块,因此可以在这种情况下使用。

基于apppool用户名生成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"

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

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