代码之家  ›  专栏  ›  技术社区  ›  crb

通过程序从元数据库IIs6中删除etag后缀(更改编号)

  •  3
  • crb  · 技术社区  · 16 年前

    IIS 6.0以“hash:changenumber”格式生成etag值。每次重置IIS时,变更号都会增加,因此您的ETag仅在您的IIS进程的生命周期内有效。重新启动,数字上升,哈希:更改数字!=hash:更改数字+1。

    The fix for this is to hard-code the changenumber ,可以使用元数据库资源管理器(用于编辑元数据库的.NET实用工具)或在IIS服务停止时编辑XML文件。

    我希望在服务器运行的情况下,以编程方式完成这项工作,就像可以使用ADSI或WMI设置所有其他元数据库属性一样。对于这一个,似乎不可能,因为属性(仅在内部称为md_etag_changenumber)似乎没有匹配的属性名。

    下面是vbscript中的问题示例:

    set obj=GetObject("IIS://localhost/W3svc")
    WScript.Echo "Log type: " & obj.LogType
    WScript.Echo "Change number: " & obj.MD_ETAG_CHANGENUMBER
    

    输出:

    Log type: 1
    etag.vbs(3, 1) Microsoft VBScript runtime error: Object doesn't support this property or method: 'obj.MD_ETAG_CHANGENUMBER'
    

    我希望能够用C设置这个值。除了停止IIS、在XML中设置值并重新启动外,是否有一种方法可以通过编程设置该值?

    我的最佳想法是(ab)使用元数据库资源管理器附带的iismblib.dll,所以如果有人使用过它,我很乐意听到。

    参考文献:

    2 回复  |  直到 13 年前
        1
  •  2
  •   Troy Parsons    13 年前

    CRB,感谢伟大的解决方案,我找不到替代方案(尽管我之前已经通过一些复杂的ADSI脚本(自定义ISAPI使用)将自己的自定义元数据库属性添加到了IIS6架构中)

    这是您的解决方案的PowerShell版本。它假定MB资源管理器程序集已本地复制到它。

    $myPath = [System.IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Path)
    
    Import-Module "$myPath\IISMbLib.dll"
    
    $etagValue = 12345
    $metabase = New-Object IISConfig.Metabase
    $metabase.OpenLocalMachine()
    
    $key = $metabase.GetKeyFromPath("/LM/W3SVC")
    
    if ($key.ContainsRecord(2039) -eq [IISConfig.ValueExistOptions]::Explicit)
    {
        $record = $key.GetRecord(2039)
        Write-Host "Existing ETag value found:", $record.Data.ToString()
    }
    else
    {
        Write-Host "Creating new value..."
        $record = New-Object IISConfig.Record
        $record.DataType = [IISConfig.Record+DataTypes]::DWORD
        $record.Identifier = 2039
        $record.ChangeAttribute([IISConfig.Record+AttributeList]::Inherit, $true)
    }
    $record.Data = [System.Convert]::ToUInt32($etagValue)
    Write-Host "New ETag value:", $record.Data.ToString()
    $key.SetRecord($record)
    
        2
  •  1
  •   crb    16 年前

    我最好的想法很好。这里有一个解决方案,它依赖于IIS6.0资源工具包中元数据库资源管理器中的iismblib.dll。

            Metabase metabase = new Metabase();
            metabase.OpenLocalMachine();
    
            IKey key = metabase.GetKeyFromPath("/LM/W3SVC/");
            if (key.ContainsRecord(2039) == IISConfig.ValueExistOptions.Explicit) {
                Record r = key.GetRecord(2039);
                r.Data = Convert.ToUInt32(0);
                key.SetRecord(r);
            } else {
                Record r = new Record();
                r.Data = Convert.ToUInt32(0);
                r.DataType = Record.DataTypes.DWORD;
                r.Identifier = 2039;
                r.ChangeAttribute(Record.AttributeList.Inherit, true);
                key.SetRecord(r);
            }
    
    推荐文章