我正在开发一个配置工具,需要根据特定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>
保证永远不会被本地化,所以我们可以回到过去的方式。
答案 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
,因为它的重载需要NTAccount
,NTAccount
是的。只需将其传递给{{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的部分功劳,尽管该脚本实际上不起作用,因为代码中未包含某些功能。