设为首页 收藏本站
查看: 613|回复: 0

[经验分享] iis设置脚本

[复制链接]
发表于 2015-8-15 07:52:14 | 显示全部楼层 |阅读模式
  

How to Manipulate (insert/replace/remove) LIST data type in IIS Configuration

  After a long tour on newsgroups, I am starting my blog today.
  For my first entry, I am going to discuss a frequent question about IIS programmatic administration - how to manipulate the LIST data type (i.e. ScriptMaps, HttpErrors, ServerBindings, etc). No, MIMEMap is not included in this because it is not a LIST (it is its own custom data type) - good topic for a future blog...
  The astute reader should realize that ADSUTIL.VBS already allows you to set/delete these LIST properties. However, ADSUTIL.VBS has a fatal flaw for multi-valued properties like LIST - it only allows you to set/delete the entire LIST. It does not allow you to replace one LIST item with a new value. Even worse, the default implementation only allows nine commandline parameters. So, suppose you wanted to:


  • add a wildcard application mapping (with long filepath)
  • replace the 404 Custom Error URL while preserving all other Custom Error definitions
  • add/edit a Host header while preserving all others
  • recursively remove an application mapping from everywhere
  THEY are all impossible do with an unmodified ADSUTIL.VBS. Therefore, I decided to write a little tool that illustrates how to:


  • Navigate and enumerate through the IIS configuration namespace (/RECURSE)
  • Locate LIST data types (like ScriptMaps, HttpErrors, ServerBindings, etc) (SYNTAX)
  • Enumerate and Manipulate LIST data type
  In fact, the above tasks become very straight forward with this tool:


  • Add a wildcard application mapping for website ID 1
    <chglist.vbs> W3SVC/1/root/ScriptMaps "" "*,%ProgramFiles%"WildcardISAPI.dll,0" /INSERT /COMMIT
  • Change the 404 Custom Error for website ID 1
    <chglist.vbs> W3SVC/1/HttpErrors 404 404,*,URL,/CustomErrors/404.asp /COMMIT
  • Add a Host header for Website ID 2 while preserving all others
    <chglist.vbs> W3SVC/2/ServerBindings FIRST ":80:Host.domain.com" /INSERT /COMMIT
  • Recursively remove application mapping for ".ext" extension
    <chglist.vbs> W3SVC/ScriptMaps ".ext" "" /REMOVE /RECURSE /ALL /COMMIT
  You can run the script with no commandline parameters for help, and operation should be self-explanatory.  The tool does not make any changes unless you add /COMMIT, so feel free to poke around the various options.  Feel free to post comments/suggestions as well as propose future topics.

  [Updated 04/22/2006 - Added `` (double-backquote) syntax to put in double-quotes into a value. This allows manipulation of ScriptMaps, Application Extensions, etc pathnames with spaces.]
  [Updated 05/11/2006 - Fixed bugs to make /recurse work correctly. Fixed bug when matching against "*" and /RegExp is not specified]

  Enjoy.
  //David


'

' Allows append/insert/remove of specific elements from an IIS "List" type node

' i.e. ScriptMap, HttpError, ServerBindings

'

' Origin : http://blogs.msdn.com/David.Wang/archive/2004/12/02/273681.aspx

' Version: December 1 2004

'

Option Explicit

On Error Resume Next



const ERROR_SUCCESS             = 0

const ERROR_PATH_NOT_FOUND      = 3

const ERROR_INVALID_PARAMETER   = 87

const LIST_OP_FIRST             = "FIRST"

const LIST_OP_LAST              = "LAST"

const LIST_OPTION_REPLACE       = 0

const LIST_OPTION_INSERT        = 1

const LIST_OPTION_REMOVE        = 2

const LIST_OPTION_ALL           = 4

const LIST_OPTION_RECURSE       = 8



Dim CRLF

CRLF = CHR(13) & CHR(10)

Dim strHelp

strHelp = "Edit/Replace IIS metabase LIST properties" & CRLF &_

CRLF &_

WScript.ScriptName & " PropertyPath ExistValue NewValue [Options]" & CRLF &_

CRLF &_

"Where:" & CRLF &_

"    PropertyPath IIS metabase property path whose data type is LIST." & CRLF &_

"                 i.e. W3SVC/ScriptMaps, W3SVC/HttpErrors" & CRLF &_

"    ExistValue   Value to case-insensitive literal match against existing" & CRLF &_

"                 LIST elements." & CRLF &_

"        FIRST    - matches the first LIST element." & CRLF &_

"        LAST     - matches the last LIST element." & CRLF &_

"    NewValue     New value that replaces the matched the LIST element." & CRLF &_

"Options:" & CRLF &_

"    /INSERT      Insert  before LIST element matching ." & CRLF &_

"    /REMOVE      Remove LIST element matching ." & CRLF &_

"    /ALL         Operate on ALL matching . Default is first match." & CRLF &_

"    /REGEXP      Use  as RegExp to match. Default is literal." & CRLF &_

"    /RECURSE     Recursively perform the operation underneath ." & CRLF &_

"    /VERBOSE     Give more status/output." & CRLF &_

"    /COMMIT      Actually perform changes. Default only shows." & CRLF &_

""



dim Debug

Debug = true

dim Verbose

Verbose = false

dim reMatch

reMatch = false



Dim strServer

Dim strNamespace

Dim strSchemaNamespace

Dim strNodeSyntax

Dim objNode



Dim nOperationType

Dim strNormalizedPath

Dim strPropertyPath

Dim strPropertyName

Dim strPropertyExistValue

Dim strPropertyNewValue



Dim i,j



'

' Start of script

'

strServer = "localhost"

strNamespace = "IIS://" & strServer

strSchemaNamespace = strNamespace & "/" & "Schema"



'

' Parse the commandline

'

If WScript.Arguments.Count < 3 Then

Err.Number = ERROR_INVALID_PARAMETER

HandleError "Insufficient number of arguments." & CRLF &_

CRLF &_

strHelp &_

""

End If



nOperationType = LIST_OPTION_REPLACE



For i = 0 To WScript.Arguments.Count - 1

Select Case UCase( WScript.Arguments( i ) )

Case "/INSERT"

nOperationType = nOperationType Or LIST_OPTION_INSERT

Case "/REMOVE"

nOperationType = nOperationType Or LIST_OPTION_REMOVE

Case "/ALL"

nOperationType = nOperationType Or LIST_OPTION_ALL

Case "/RECURSE"

nOperationType = nOperationType Or LIST_OPTION_RECURSE

Case "/COMMIT"

Debug = false

Case "/VERBOSE"

Verbose = true

Case "/REGEXP"

reMatch = true

Case Else

If ( i = 0 ) Then

'

' Split out PropertyName and its ParentPath from PropertyPath

'

Err.Clear

strNormalizedPath = NormalizePath( WScript.Arguments( 0 ) )

HandleError "Failed to normalize PropertyPath."



j = InstrRev( strNormalizedPath, "/", -1, 0 )



If ( j = 0 Or j = 1 ) Then

Err.Number = ERROR_PATH_NOT_FOUND

HandleError "Invalid PropertyPath."

End If



Err.Clear

strPropertyPath = NormalizePath( Mid( strNormalizedPath, 1, j - 1 ) )

HandleError "Failed to retrieve/normalize PropertyPath."



Err.Clear

strPropertyName = NormalizePath( Mid( strNormalizedPath, j + 1 ) )

HandleError "Failed to retrieve/normalize PropertyName."

ElseIf ( i = 1 ) Then

'

' The existing match value

'

strPropertyExistValue = Replace( UCase( WScript.Arguments( 1 ) ), "``", """" )

ElseIf ( i = 2 ) Then

'

' The new replace value

'

strPropertyNewValue = Replace( WScript.Arguments( 2 ), "``", """" )

Else

Err.Number = ERROR_INVALID_PARAMETER

HandleError "Unknown parameter " & WScript.Arguments( i ) & CRLF &_

CRLF &_

strHelp &_

""

End If

End Select

Next



LogVerbose "OpType       = " & nOperationType

LogVerbose "PropertyPath = " & strPropertyPath

LogVerbose "PropertyName = " & strPropertyName

LogVerbose "ExistValue   = " & strPropertyExistValue

LogVerbose "NewValue     = " & strPropertyNewValue



'

' Check the data type for the given property

' If it is not LIST, do not process any further

'

Err.Clear

Set objNode = GetObject( strSchemaNamespace & "/" & strPropertyName )

HandleError "Cannot read schema for property " & strPropertyName

strNodeSyntax = UCase( objNode.Syntax )



LogVerbose "Syntax       = " & strNodeSyntax

LogVerbose ""



Select Case strNodeSyntax

Case "LIST"

'

' Finally, we are ready to do some real work

'

Err.Clear

Err.Number = HandleListOps( nOperationType, strPropertyPath, strPropertyName, strPropertyExistValue, strPropertyNewValue, ( nOperationType And LIST_OPTION_RECURSE ) <> 0 )

HandleError ""

Case Else

Err.Clear

Err.Number = ERROR_PATH_NOT_FOUND

HandleError "Cannot handle " & strPropertyPath & "/" & strPropertyName & " with type " & strNodeSyntax

End Select



'

' End of script

'



'

' Sub routines and functions

'

Sub HandleError( errorDescription )

If ( Err.Number <> 0 ) Then

If ( IsEmpty( errorDescription ) ) Then

LogEcho Err.Description

Else

LogEcho errorDescription

End If



WScript.Quit Err.Number

End If

End Sub



Function NormalizePath( strInput )

'

' Replace all " with /

'

strInput = Replace( strInput, """, "/", 1, -1 )



'

' Replace all // with /

'

Do

strInput = Replace( strInput, "//", "/", 1, -1 )

Loop While ( Instr( strInput, "//" ) <> 0 )



'

' Removing leading and trailing /

'

If ( Left( strInput, 1 ) = "/" ) Then

strInput = Right( strInput, Len( strInput ) - 1 )

End If



If ( Right( strInput, 1 ) = "/" ) Then

strInput = Left( strInput, Len( strInput ) - 1 )

End If



NormalizePath = strInput

End Function



Function HandleListOps( OpType, strPropertyPath, strPropertyName, strPropertyExistValue, strPropertyNewValue, bRecurse )

On Error Resume Next

Dim objNode, objNodeAttribute

Dim objList

Dim objElement

Dim objNewArray

Dim PerformedOperation

Dim Operation

Dim re

Dim reMatched

Dim i, j



Err.Clear

Set objNode = GetObject( strNamespace & "/" & strPropertyPath )

objList = objNode.Get( strPropertyName )



If ( Err.Number <> 0 Or IsEmpty( objList ) ) Then

LogEcho "Failed to retrieve " & strPropertyPath & "/" & strPropertyName

HandleListOps = Err.Number

Exit Function

End If





Err.Clear

Set objNodeAttribute = objNode.GetPropertyAttribObj(strPropertyName)

HandleError "Failed to retrieve Attributes for " & strPropertyPath & "/" & strPropertyName



If ( objNodeAttribute.IsInherit = true ) Then

LogEcho strPropertyPath & "/" & strPropertyName & " (Inherited)"



If ( bRecurse = true ) Then

LogEcho( "Ignoring inherited property for Recursive Modification" )

Exit Function

End If

Else

LogEcho strPropertyPath & "/" & strPropertyName

End If





'

' j is the count of elements in objNewArray

' So that we can resize it to the right size in the end

'

j = 0



'

' Size objNewArray to maximum possible size up-front, later shrink it

'

Redim objNewArray( UBound( objList ) + UBound( objList ) + 1 )



'

' PerformedOperation indicates whether something has matched and already

' operated upon, in this session.  Start with 'not yet' = 0

'

PerformedOperation = 0



'

' Setup the RegExp match based on the existing value to search for

'

Set re = new RegExp

re.Pattern = strPropertyExistValue

re.IgnoreCase = true

re.Global = true



'

' Do this test outside of IF conditional because on error resume next

' turns off failures due to incorrect Pattern

'

Err.Clear

reMatched = re.Test( objElement )

If ( Err.Number <> 0 Or reMatch = false ) Then

reMatched = false

End If



LogVerbose "Original:"



For i = LBound( objList ) To UBound( objList )

objElement = objList( i )

'LogVerbose i & "(" & j & ")" & ": " & objElement



If ( ( ( ( strPropertyExistValue = LIST_OP_FIRST ) And ( i = LBound( objList ) ) ) Or _

( ( strPropertyExistValue = LIST_OP_LAST  ) And ( i = UBound( objList ) ) ) Or _

( ( reMatch = false ) And ( Instr( UCase( objElement ), strPropertyExistValue ) > 0 ) ) Or _

( reMatched = true ) _

) _

And _

( ( ( OpType And LIST_OPTION_ALL ) <> 0 ) Or ( PerformedOperation = 0 ) ) _

) Then

Operation = "Replace "



If ( ( OpType And LIST_OPTION_REMOVE ) <> 0 ) Then

'Don't copy this element for deletion

Operation = "Remove "

Else

objNewArray( j ) = strPropertyNewValue

j = j + 1



If ( ( OpType And LIST_OPTION_INSERT ) <> 0 ) Then

Operation = "Insert "

objNewArray( j ) = objElement

j = j + 1

End If

End If



PerformedOperation = 1

Else

Operation = ""

objNewArray( j ) = objElement

j = j + 1

End If



LogVerbose Operation & objElement

Next



'

' Resize the final array to the correct size prior to SetInfo

'

ReDim Preserve objNewArray( j - 1 )



LogVerbose "New:"



For i = LBound( objNewArray ) To UBound( objNewArray )

LogDebug i & ": " & objNewArray( i )

Next



If ( Debug = false ) Then

If ( PerformedOperation = 1 ) Then

Err.Clear

objNode.Put strPropertyName, objNewArray

objNode.SetInfo

HandleError "Failed to SetInfo " & strPropertyPath & "/" & strPropertyName

LogEcho "SUCCESS: Updated " & strPropertyPath & "/" & strPropertyName

Else

LogEcho "SUCCESS: Nothing to update"

End If

Else

If ( PerformedOperation = 1 ) Then

LogEcho "DEBUG: Matched. Did not SetInfo"

Else

LogEcho "SUCCESS: No Match. Did not SetInfo"

End If

End If



If ( bRecurse = true ) Then

For Each objElement In objNode

LogEcho ""

HandleListOps = HandleListOps( OpType, NormalizePath( Mid( objElement.AdsPath, Len( strNamespace ) + 1 ) ), strPropertyName, strPropertyExistValue, strPropertyNewValue, bRecurse )

Next

End If



HandleListOps = 0

End Function



Sub LogEcho( str )

WScript.Echo str

End Sub



Sub LogDebug( str )

If ( Debug = true ) Then

LogEcho str

End If

End Sub



Sub LogVerbose( str )

If ( Verbose = true ) Then

LogEcho str

End If

End Sub

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-99120-1-1.html 上篇帖子: C#添加IIS站点 下篇帖子: 【转】IIS排错
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表