InfoPath & SharePoint Designer를 이용한 Workflow 개발방법 Workflow


이번엔, 제목그대로 InfoPath2010과 SharePoint Designer2010을 이용해서 SharePoint Workflow를 개발해 보도록 하겠습니다.

1. 먼저 [휴가신청서]라는 이름의 결재문서를 InfoPath를 이용해서 만듭니다.


위의 빨간색으로 표시된 것처럼.. 날짜를 선택함에 따라 자동계산하는 로직의 구현은 아래와 같습니다.

startDate
(number(substring(endDate, 9, 2)) + floor((153 * (number(substring(endDate, 6, 2)) + 12 * (floor((14 - number(substring(endDate, 6, 2))) / 12)) - 3) + 2) / 5) + (number(substring(endDate, 1, 4)) + 4800 - (floor((14 - number(substring(endDate, 6, 2))) / 12))) * 365 + floor((number(substring(endDate, 1, 4)) + 4800 - (floor((14 - number(substring(endDate, 6, 2))) / 12))) / 4) - floor((number(substring(endDate, 1, 4)) + 4800 - (floor((14 - number(substring(endDate, 6, 2))) / 12))) / 100) + floor((number(substring(endDate, 1, 4)) + 4800 - (floor((14 - number(substring(endDate, 6, 2))) / 12))) / 400) - 32045) - (number(substring(., 9, 2)) + floor((153 * (number(substring(., 6, 2)) + 12 * (floor((14 - number(substring(., 6, 2))) / 12)) - 3) + 2) / 5) + (number(substring(., 1, 4)) + 4800 - (floor((14 - number(substring(., 6, 2))) / 12))) * 365 + floor((number(substring(., 1, 4)) + 4800 - (floor((14 - number(substring(., 6, 2))) / 12))) / 4) - floor((number(substring(., 1, 4)) + 4800 - (floor((14 - number(substring(., 6, 2))) / 12))) / 100) + floor((number(substring(., 1, 4)) + 4800 - (floor((14 - number(substring(., 6, 2))) / 12))) / 400) - 32045) + 1

endDate
(number(substring(., 9, 2)) + floor((153 * (number(substring(., 6, 2)) + 12 * (floor((14 - number(substring(., 6, 2))) / 12)) - 3) + 2) / 5) + (number(substring(., 1, 4)) + 4800 - (floor((14 - number(substring(., 6, 2))) / 12))) * 365 + floor((number(substring(., 1, 4)) + 4800 - (floor((14 - number(substring(., 6, 2))) / 12))) / 4) - floor((number(substring(., 1, 4)) + 4800 - (floor((14 - number(substring(., 6, 2))) / 12))) / 100) + floor((number(substring(., 1, 4)) + 4800 - (floor((14 - number(substring(., 6, 2))) / 12))) / 400) - 32045) - (number(substring(startDate, 9, 2)) + floor((153 * (number(substring(startDate, 6, 2)) + 12 * (floor((14 - number(substring(startDate, 6, 2))) / 12)) - 3) + 2) / 5) + (number(substring(startDate, 1, 4)) + 4800 - (floor((14 - number(substring(startDate, 6, 2))) / 12))) * 365 + floor((number(substring(startDate, 1, 4)) + 4800 - (floor((14 - number(substring(startDate, 6, 2))) / 12))) / 4) - floor((number(substring(startDate, 1, 4)) + 4800 - (floor((14 - number(substring(startDate, 6, 2))) / 12))) / 100) + floor((number(substring(startDate, 1, 4)) + 4800 - (floor((14 - number(substring(startDate, 6, 2))) / 12))) / 400) - 32045) + 1

이렇게 필드값에 동작값을 명시하면 되고, 아울러 두 필드값들에 추가로 비어있을 경우에는 '0'값을 넣는 것도 잊지말아야 합니다.


자, 다음은 신청자의 사용자정보값을 가져오기입니다.
DisplayName과

부서명을 가져옵니다.

이때에는, 다음과같이 [웹 서비스] 데이터 연결을 이용하여 가져오기합니다.
/_vti_bin/People.asmx 를 이용하여 가져옵니다.
작업선택에서 SearchPrincipals를 선택하고,

위와 같이 기본값을 줍니다.


이제 InfoPath 디자인 폼에 와서 아래와 같이 양식로드시, Param값을 줍니다.

아래와 같이 SharePoint로 양식전송시, 파일이름 등을 지정합니다. 여기서 [양식이 있는 경우 덮어쓰기 허용]은 '아니오'로 해야겠죠..^^

디자인작업이 완료되었으면, SharePoint로 양식을 게시합니다.
여기까지 양식디자인은 완료가 되었습니다.
이제 SharePoint Designer2010을 이용한 Workflow를 개발해 보도록 하겠습니다.

먼저, SharePoint에서 원하는 위치에 결재용 [양식 라이브러리]를 만듭니다. 뭐 굳이 안 만들어놔도 SharePont Designer에서 만들 수도 있습니다.
상단에 [목록 워크플로]를 선택하고, 위에서 만든 양식라이브러리를 선택합니다.
워크플로를 만듭니다.
좀더 복잡하게도 만듭니다.

조건절도 구현해 봅니다.

결재가 진행되면 다음과 같이 [상태 페이지에 워크플로 시각화 표시]로 진행상태를 볼 수가 있습니다.

-----------------------------------------------------------------------------------------------------------------
문제점

간혹 아래처럼 사용자 프로필을 못가져오는 경우가 있습니다.

이럴 땐, 중앙관리 - User Profile Service 응용 프로그램에서 동기화작업이 이뤄지질 않아서 입니다. 이것을 활성화하면 됩니다.

만약, 동기화 서비스가 활성화되지 않는다면(시작 에러 등), 서비스에서 FIM Synchronization Service가 [시작됨]으로 되어있는지 여부를 확인해 봅니다.

또한, 워크플로 구성시, 아래처럼 [상태 페이지에 워크플로 시각화 표시]가 비활성화 되어있다면, 해당 서버에 Windows Office Visio Professional 2010 이상을 설치하시기 바랍니다.
그리고, 중앙관리에서 Visio Graphics Service도 [시작됨]인지 확인해 보시기 바랍니다.

자, 이렇게 Windows Office Visio Professional 2010 이상버전을 까시게 되면, 아래처럼 [상태 페이지에 워크플로 시각화 표시]가 활성화된 것을 확인하실 수 있습니다. 

아참, 만약 워크플로 구성시, 기본 승인워크플로를 가지고 구성하시게 되면, 메일 내용에서 아래처럼 [이 워크플로의 상태 보기]를 통해 SharePoint에서 쉽게 진행상태를 확인할 수가 있습니다.


워크플로 상태값중에서 진행 값이 아래와 같이 숫자 형태로 나오는 것을 볼 수 있는데..
상태에 따른 숫자값은 아래와 같습니다.

Status

Value

Not Started

0

Failed on Start

1

In Progress

2

Error Occurred

3

Canceled

4

Completed

5

Failed on Start(Retrying)

6

Error Occurred (Retrying)

7

Canceled

15

Approved

16

Rejected

17


실제 워크플로 구성시, 아래와 같이 사용합니다.


다음은 버그같기도 하고.. 아직 원인을 찾지는 못했습니다만..
목록설정에 가보면, 워크플로 이름들이 계속 생성돼 있는것을 볼 수 있네요.
물론 인스턴스는 없음으로 된 것들이지만, 보긴 안좋네요..ㅠ


SharePoint2010에서의 InfoPath 게시관련 Tip Infopath

로컬 어플리케이션(Office InfoPath2010)에서는 잘 구현되는 것을 확인하고. SharePoint Form Services를 통해 웹브라우저로 구현하려는 와중에 다음과 같은 에러가 발생하더군요.

원인은 제 개발PC에 SharePoint 2010 중앙관리에 [응용 프로그램 관리] -> [State Service]가 설정되지 않아서 였습니다.

해결방법은

[시작] -> [Microsoft SharePoint 2010 Products] -> [SharePoint 2010 관리 셀]을 여셔서,

$serviceApp = New-SPStateServiceApplication -Name "State Service"

New-SPStateServiceDatabase -Name "StateServiceDatabase" -ServiceApplication $serviceApp

New-SPStateServiceApplicationProxy -Name "State Service" -ServiceApplication $serviceApp -DefaultProxyGroup

요렇게 실행하셔서 State Service 기능을 추가하시면 됩니다.

응용 프로그램 관리에 가시면 [State Service]가 추가된 것을 보실 수 있습니다.
이제 SharePoint 사이트에 InfoPath를 게시하시면, 아래처럼 웹브라우저에서 정상적으로 작동하는 것을 보실 수 있습니다.

좀더 자세한사항은 아래 사이트를 참조하시기 바랍니다.^^

http://technet.microsoft.com/en-us/library/ff182792.aspx


SharePoint & SSIS(SQL Server Integration Service) 개발방법 SSIS

이전 포스트(http://wonx.egloos.com/1892949)에서 SSIS를 통해 SharePoint List로 Data 적재하는 방법에 대해 소개한 적이 있습니다.

이번엔 SSIS를 이용해 SharePoint에 Data를 적재하는 좀 더 구체적인 개발방법을 소개하도록 하겠습니다.

먼저 아래 그림과 같이 개발을 할까합니다. 개발 내용을 잠시 소개해 드리자면,

1. SQL DB Temp Table(SharePoint의 특정 목록이 저장될..)에 들어있는 Data를 지웁니다.

2. SharePoint의 특정 목록(법인카드관리대장)에서 데이터를 가져다가 SQL DB Temp Table에 적재를 합니다.

3. 위에서 가져온 SQL DB의 법인카드관리대장 Table의 값중에 기존 SQL 카드사 DB Table에 카드사용자정보 등의 값을 업데이트 합니다.

4. SQL 카드사 DB Table의 내용을 SharePoint 목록(법인카드전체내역)에 추가합니다.


4번 항목에서 주의해서 처리할 것은, SQL 카드사 DB Table의 내용을 SharePoint 목록(법인카드전체내역)에 추가할 때, 이미 추가한 내용을 제외하고 추가하기 위해 상태관리값(Status) 필드를 두고, Status=Null 일 경우에만 SharePoint에 추가하고 추가된 Data의 Status 필드값을 "전송완료"로 업데이트 합니다.(이러면 같은 데이터가 두번 전송되는 일은 없겠죠..^^)


또한, [SharePoint List Destination]에서 SQL DB Table의 값과 SharePoint List의 필드값들을 동기화해 주는 것도 필요합니다.

아래 이미지처럼 SharePoint의 목록명을 한글로 만들었다면, 아래처럼 알 수 없는(?) 필드명이 보이는데, 이럴 경우 SharePoint 목록의 설정에 가서 확인해 볼 수 있습니다.



Extracting and Loading SharePoint Data in SQL Server Integration Services SSIS

Introduction

Integration Services package developers often ask about the best way to get data out of or into a SharePoint list. The SharePoint List Source and Destination Sample available on the Microsoft SQL Server Community Samples: Integration Services page on Codeplex provides an optimized solution with an easy-to-use interface. The sample also includes an API for accomplishing these tasks efficiently outside of Integration Services.

There a few different ways to extract or load SharePoint data:

  • Use the SharePoint APIs to add or remove items one by one.
  • Use the SharePoint Batch API to generate XML and submit the XML.
  • Use the Lists Web service, which uses the same XML as the Batch API.

Calling the Web service is a powerful way to transfer data to or from SharePoint, whether or not you have extensive rights in your SharePoint environment, because it does not alter the SharePoint server itself in any way. The Web service also uses the Batch XML structure, which provides better performance than the server APIs for extracting or loading data.

Features of the SharePoint List Source and Destination

The SharePoint List source and destination use public SharePoint Web services and have several features that enhance their performance and their ease of use:

  • Only the fields that you want are returned from SharePoint.
  • Large lists are not transferred all at once. They are paged in batches, with a configurable batch size.
  • Column type information from SharePoint is used for mapping to Integration Services data types
  • CAML queries can be added to the query to filter the rows to be returned.
  • Update and Delete operations from an Integration Services package are simple.
  • Important custom properties of the source and destination can be set by using Integration Services e-pressions.

Preparing to Use the SharePoint List Source and Destination

To prepare to use the SharePoint List source and destination:

1. Download the appropriate installer package from the Codeplex site: Microsoft SQL Server Community Samples: Integration Services - Release: SharePoint List Source and Destination.

2. Run the installer package.

Figure 1. Welcome page of the Setup utility.

3. Add the source and destination to the Toolbox:

a. Open Business Intelligence Development Studio or Visual Studio.

b. Create a new Integration Services project, or open an existing one.

Figure 2. Creating a new Integration Services project.

c. On the Tools menu, select Choose Toolbox Items.

Figure 3. The Choose Toolbox Items option on the Tools menu.

d. On the SSIS Data Flow Items tab of the Choose Toolbox Items dialog box, select the SharePoint List Source and the SharePoint List Destination by checking the boxes. Then click OK.

Figure 4. The SSIS Data Flow Items tab of the Choose Toolbox Items dialog box

e. If you find that the source and destination have been added to the General list in the toolbox, drag the source to the Data Flow Sources list, and drag the destination to the Data Flow Destinations list.

Figure 5. Moving the source and destination to the appropriate categories in the Toolbox.

4. Prepare your SharePoint list for testing.

Figure 6. A sample SharePoint list.

Extracting Data from SharePoint by Using the SharePoint List Source

Here is the visual representation of the SharePoint List source after you add it to the data flow of an Integration Services package.

Figure 7. The SharePoint List source in the data flow.

Setting the Properties of the SharePoint List Source

You can configure the following custom properties of the SharePoint List source in the Advanced Editor.

Figure 8. The custom properties of the SharePoint List source displayed in the Advanced Editor.

BatchSize

The SharePoint List source retrieves items from SharePoint in batches. Try 1,000 items at a time as a starting point – this should work well with a typical 15-column SharePoint list. You can vary this number based on the number of columns that you want to retrieve and the width of the columns.

If you only request a few small columns, then you can increase this number for better performance. If you request a lot of columns, or wide columns, then you may need to reduce the batch size.

Determining the best batch size may require some trial and error. Keep in mind that SharePoint builds and sends its response in XML format. If the XML response is too large, an exception with an uninformative message will be raised.

If you have problems with the batch size, set the batch size to match the paging size used for the SharePoint list view before you try a larger number. If your results include text fields of widely varying lengths, decide whether it’s necessary to include those columns.

CamlQuery

You can use a CAML query to filter the data returned by the server. You can create a dynamic CAML query by using an Integration Services e-pression to set this property.

IncludeFolders

By default, folders that are found in a list are not returned. However, you can change this setting.

IsRecursive

By default, only the list items at the top level are returned. If the list contains folders that contain other items, you can change this setting to load both the items in the top-level folder, and the items in all child folders.

SiteListName

The name of the SharePoint list, as seen on the SharePoint list page.

SiteListViewName

The name of the SharePoint list view from which you want to retrieve data. You can use a list view to pre-filter rows and eliminate the need to add dynamic CAML queries to your package.

If you do not specify a list view name, then the default list view is used. The default list view is the one that appears first in the View dropdown list, which may not show all of the items in the list. Leaving this option blank is the same as entering the default list view, which is typically All Items if the default has not been changed.

Figure 9. Viewing all items in a SharePoint list.

SiteURL

The URL for the primary site on which the list is found. Do not include any other subfolders or list paths, or the location of an .asmx file.

Selecting Columns

Selecting Columns by Using the Column Mappings Page

After you configure the custom properties for the SharePoint List source, go to the Column Mappings page of the Advanced Editor to select the columns from the list that you want to include in the data flow. To improve the performance of the extraction from SharePoint, select Ignore for any columns that you don’t need in your data flow.

Selecting Columns by Using the Input and Output Properties Page

When you remove columns by using the Column Mappings page, the columns contain no data, but they still consume space in the buffers of data that pass through the data flow. To remove unwanted columns completely and optimize the use of memory for buffers, remove the columns from the Output Columns list on the Input and Output Properties page.

Figure 10. The list of columns on the Column Mappings page of the Advanced Editor.

Writing Data to SharePoint by Using the SharePoint List Destination

Here is the visual representation of the SharePoint List destination after you add it to the data flow of an Integration Services package.

Figure 11. The SharePoint List destination in the data flow.

Setting the Properties of the SharePoint List Destination

You can configure the following custom properties of the SharePoint List destination in the Advanced Editor.

Figure 12. The custom properties of the SharePoint List destination displayed in the Advanced Editor.

BatchSize

Since updates or deletes add to the size of the XML message, you have to use a smaller batch size for updates and deletes than for retrieving list items. Try 200 updates at a time as a starting point, and adjust this value as necessary.

BatchType

The SharePoint List destination can create, update or delete rows of data.

  • Create a Row (Modification Batch Type). A row is created on the server when you select this batch type and do not specify an ID value for a given row of data. Any columns that are not included receive the default values or a NULL value on the server.
  • Update a Row (Modification Batch Type). A row is updated on the server when you select this batch type and specify the ID of an existing row. Only the columns contained in the data flow are modified. If you specify this batch type, but the data flow does not contain any updated rows, an error is raised.
  • Delete a Row (Deletion Batch Type). A row is deleted on the server when you select this batch type and specify the ID of an existing row. If you specify this batch type, but the data flow does not contain any deleted rows, an error is raised.

SiteListName

This property behaves the same as the property of the same name for the SharePoint List source.

SiteListViewName

This property behaves the same as the property of the same name for the SharePoint List source. If a row being modified or deleted is present in the view, then the action will not occur and will cause the data flow to raise an error.

SiteURL

This property behaves the same as the property of the same name for the SharePoint List source.

Selecting Columns

After you configure the custom properties for the SharePoint List destination, go to the Column Mappings page of the Advanced Editor to select the columns from the data flow that you want to load into SharePoint. Any columns that exist on the server but not in the data flow will be ignored during the loading of data.

Working with SharePoint Data in the Data Flow

Looking Up Values in a SharePoint List

If you have to look up a value in a SharePoint list, you can use the Lookup transformation in your data flow, and use the SharePoint List source to load the lookup table. You may have to add a Derived Column transformation or a Script component that splits data in the lookup column on the ";#" delimiter to separate the ID value from the description.

If you are replacing values in your data with the values that you look up in the list, then loading the changed data back into SharePoint, you only have to include the ID from the lookup column. SharePoint ignores the description if you include it.

Understanding the Data Types of Columns

The data types of columns that are loaded by the SharePoint List source are derived from columns in the SharePoint list.

SharePoint supplies NULL values when data has not been entered and a column does not have a default value. When a new column is added to a list, all existing rows contain NULL in that column by default. The logic of your package has to recognize the possibility of NULL values.

Previewing Data

You can easily preview the data in your data flow by adding a Data Viewer.

Figure 13. Configuring a Data Viewer to preview data.

To preview data by adding a Data Viewer to the data flow:

1. Double-click on the path (that is, the connecting arrow) between the two components at the point in the data flow where you want to view the data.

2. In the Data Flow Path Editor, select Data Viewers, then click Add.

3. In the Configure Data Viewer dialog box, select Grid, then click OK to close the dialog box. Click OK again to close the Data Flow Path Editor.

When you run the package, you will see a grid that shows the current state of the data as it flows from the source to the destination. This can help you to ensure that you have correctly configured the properties of the components and the logic of the package.

Setting Properties by Using Integration Services E-pressions

You can set many of the custom properties of the SharePoint List source and destination by using Integration Services e-pressions. Keep in mind that, in the data flow, you have to create these e-pressions on the containing Data Flow task, and not on the individual data flow component.

Figure 14. Using e-pressions to set the properties of the SharePoint List source and destination.

You can use e-pressions to set the following properties of the SharePoint List source:

  • SiteUrl
  • SiteListName
  • SiteListViewName
  • CamlQuery

You can use e-pressions to set the following properties of the SharePoint List destination:

  • SiteUrl
  • SiteListName
  • SiteListViewName

There are several ways to set an e-pression that offer considerable flexibility to the package developer:

  • You can use a package variable to set an e-pression. The e-pression can take its value from a package variable, which might also contain an e-pression. This e-pression can construct CAML dynamically, or contain the results of a query sent to the SharePoint site by an Execute SQL task.
  • You can use a package configuration to set an e-pression. Configurations simplify deployment by extracting values that you may want to change from the package into a separate file or storage location.

Using SharePointUtility.dll Outside of Integration Services

The SharePoint List source and destination install and use an assembly (SharePointUtility.dll) of utility functions which can also be used outside of Integration Services for accessing SharePoint Lists.

Figure 15. The methods of the ListServiceUtility class in the SharePointUtility.dll assembly.

The ListServiceUtility class in the SharePointUtility.dll assembly has the following features:

  • Although the methods of the class require parameter values, the parameters do not use GUID values and do not expose SharePoint XML.
  • When you request list data, the methods of the class return rows with a dictionary for the columns and values. When you update rows, you have to provide a list of dictionaries in return, where the names in the dictionary are column names.
  • When you work with the methods of the class, you never see the ows_ prefix, and spaces are converted from their XML representation (_x0020_) to a space character.
  • Files can be uploaded and removed easily. The methods also support SharePoint on a port other than port 80. (Older versions of Windows only support port 80 for WebDAV).
  • XML results are reformatted for update operations. If an error occurs during the update, a different XML structure that contains a description is returned, as in the following examples:

Normal result of an update

XML
<result ID=”1” > <action>Success</action> <row [attributes are columns, and their values]></row> </result>

Result of an update after an error

XML
<result ID=”1” >       <action>Failure</action>       <errorCode>0x81020015</errorCode>       <errorDescription>The changes requested conflict with those made by another client.</errorDescription> <row [attributes are columns, and their values]></row> </result>

Conclusion

The SharePoint List Source and Destination Sample makes it easy to get data out of or into a SharePoint list from an Integration Services package. The sample also includes a utility library that simplifies working with SharePoint lists outside of Integration Services.

If you have feedback or questions about these components, please visit the Codeplex site at http://www.codeplex.com/SQLSrvIntegrationSrv.

원본 출처 : http://msdn.microsoft.com/en-us/library/dd365137(SQL.100).aspx


Port Open 여부 확인 프로그램 Server구성

프로젝트를 뛰다보면, 운영서버들이 원격지에 있는 경우가 종종 있습니다. 일명 IDC센터라고 부르기도 하고, 업체마다 무슨무슨센터라고 달리 부르는 경우도 있습니다.
이렇게 원격지에 운영서버가 있는 경우에, 종종 Port가 막혀서 고생하는 경우가 있는데요.(방화벽문제, 보안기능)

서버와의 Port Open여부를 확인해 주는 프로그램을 소개할 까 합니다.
http://download.microsoft.com/download/3/f/4/3f4c6a54-65f0-4164-bdec-a3411ba24d3a/PortQryUI.exe

위 사이트에서 설치화일을 내려받기 후, 저장합니다. 저장한 화일을 실행시키면 압축이 풀리면서 5개 화일이 생기는데, 그 중 portqueryui.exe을 실행합니다.

아래 그림에서 [Enter destination IP or FQDN to query: ] 부분에 IP & FQDN을 입력하고 [Query]버튼을 클릭합니다.

그러면, Query Result 부분에 결과들이 나올겁니다.

그중에서 해당 Port번호 옆에 [LISTENING] or [FILTERED]가 표시되는데..

[LISTENING] = Port Open

[FILTERED] = Port Close

입니다.

그리고, 특정 Port들만을 검사하고 싶을 때는, 아래 그림에서 드롭다운 메뉴처럼 선택할 수 있게 만들 수가 있습니다.

이 근간이 되는 Data는 위에서 다운받고 압축해제한 파일 중에 config.xml에서 추가/수정 하시면 됩니다.


Tip. xml 편집시,

- TCP( Trasmission Control Protocol ) 는 신뢰성을 보장 하는 프로토콜로서, Seq No.와 Ack No.를 이용하여 중간 유실이나 흐름 장애시 재전송을 하는 프로토콜 입니다.

- UDP( User Datagram Protocl )는 TCP와 마찬가지로 data의 전송을 위한 프로토콜 이지만.. 신뢰성을 보장 하지는 않습니다. TCP와 다른 점은 UDP는 중간에 패킷이 유실이나 변조가 되어도 재전송을 하지 않습니다.

- Protocol="BOTH"는 TCP와 UDP 둘 다 시도하라는 Port 명령입니다.

도메인 참여시 Port Open 확인

http://technet.microsoft.com/ko-kr/library/bb727063(en-us).aspx



방화벽 등의 이유로 원격데스크탑(터미널 서비스)의 디폴트 포트(3389)로
외부에서 원격데스크탑 연결을 열수 없을 경우

아래와 같이 포트 번호를 바꾸면

지정한 포트번호로 연결할 수 있다.

** 서버에서 작업

1. registry edit...

2. HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TerminalServer

\WinStations\RDP-Tcp\PortNumber
의 포트번호 변경

3. registry edit 종료

4. 터미널 서비스 restart.

4.1 시스템등록정보(내컴퓨터 오른쪽마우스-속성) -> "원격"탭(맨오른쪽)

-> 원격데스크톱 체크 해제 -> 적용 -> 다시 체크 -> 적용(또는 확인)

4.2 또는 reboot

5. 방화벽이 적용된 경우 제어판의 "보안센터"에서 "Windows방화벽" 설정

5.1 "일반"탭 -> "사용" 설정 후 예외조항 추가(예외허용안함 체크되어있으면 해제)하기

=> "예외"탭 -> "포트 추가"

-> 이름 : 임의로 (예, 원격데탑1)

포트번호 : 위의 2단계에서 설정한 포트번호 입력 -> 확인 -> 방화벽창 확인, 닫기

5.2 귀찮으면 "일반"탭 -> "사용안함"으로 설정

** 클라이언트에서 원격데스크탑 연결

6. 포트가 변경된 원격 데스크탑에 연결할 경우

6.1 원격데스크탑연결 -> xxx.xxx.xxx.xxx:5522 와 같이 IP주소 뒤에 포트번호를 쓰시고 접속.
6.2 또는 실행(cmd)창 -> mstsc /v ip:port#

출처 : http://blog.naver.com/madabba?Redirect=Log&logNo=150005277147


[SharePoint 장애]데이터시트 보기 장애극복

[데이터시트 보기]라는 기능이 안된다면, 우선 살펴봐야 할 것이 있습니다.
[중앙관리] - [응용 프로그램 관리] - [인증공급자]에서 아래처럼 [클라이언트 통합인증]이 되어있는지 확인하면 됩니다.


SharePoint 2010에서 목록의 보기 서식에서 [데이터시트 보기]라는 기능이 있는데, 선택을 하면 아래와 같은 에러가 발생합니다.

원인은, 사용자 컴퓨터의 Office버전이 64bit버전은 32bit Active-X 컨트롤을 함께 제공하지 않는 것에 있습니다.

출처 = http://www.knowsharepoint.com/2010/06/sharepoint-datasheet-view-and-office.html

그래서 아래 사이트에 접속해서 [데이터 연결 구성요소] 컴포넌트를 다운받아, 해당 사용자 PC(64bit)에 설치하면 됩니다.

http://www.microsoft.com/downloads/ko-kr/details.aspx?FamilyID=7554F536-8C28-4598-9B72-EF94E038C891


http://blogs.msdn.com/bi/ 사이트링크


Login.aspx .Net Dev

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Login.aspx.cs" Inherits="_Login" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>로그인</title>
</head>
<body>

<% if (id != "")   { %>
<script type="text/javascript" language="javascript">

    var _url = "<%=url%>";
    var _domain = "<%=domain%>";
    var _id = "<%=id%>";
    var _pw = "<%=pw%>";
    var _http = new ActiveXObject("Microsoft.xmlHTTP");
   
    var _domainID = _domain + "\\" + _id;

    try
    {
        _http.open("GET", _url, false, _domainID, _pw);
        _http.setRequestHeader("Content-type:", "text/xml; charset=\"UTF-8\"");
        _http.send();

        if (_http.status == 200)
            document.location.href = _url;
    }
    catch (e)
    {}
}
</script>
<% } %>

</body>
</html>


 


Login.aspx.cs

신뢰할 수 있는 사이트 자동등록 하기 .Net Dev

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Runtime.InteropServices;

namespace CredentialManager
{
    public partial class Form1 : Form
    {
        public static Guid CLSID_InternetSecurityManager = new Guid("7b8a2d94-0ac9-11d1-896c-00c04fb6bfc4");
        public static Guid IID_IInternetSecurityManager = new Guid("79eac9ee-baf9-11ce-8c82-00aa004ba90b");

        private const uint SZM_CREATE = 0;
        private const uint SZM_DELETE = 1;

        public const uint ZoneLocalMachine = 0;
        public const uint ZoneIntranet = 1;
        public const uint ZoneTrusted = 2;
        public const uint ZoneInternet = 3;
        public const uint ZoneUntrusted = 4;

        public Form1()
        {
            InitializeComponent();
            AddSiteToZone(ZoneTrusted, "http://test.wonx.com");
        }

        private static IInternetSecurityManager CreateInternetSecurityManager()
        {
            Type iismType = Type.GetTypeFromCLSID(CLSID_InternetSecurityManager);
            return (IInternetSecurityManager)Activator.CreateInstance(iismType);
        }

        public static void AddSiteToZone(uint zone, string pattern)
        {
            try
            {
                IInternetSecurityManager ism = CreateInternetSecurityManager();
                ism.SetZoneMapping(zone, pattern, SZM_CREATE);
            }
            catch (COMException e)
            {
                throw new InvalidOperationException("URL has already been added to a zone", e);
            }
            catch (UnauthorizedAccessException e)
            {
                throw new InvalidOperationException("Can't add non-SSL site to zone that requires SSL", e);
            }
        }

        public static void RemoveSiteFromZone(string pattern)
        {
            uint currentZone;
            IInternetSecurityManager ism = CreateInternetSecurityManager();
            ism.MapUrlToZone(pattern, out currentZone, 0);
            ism.SetZoneMapping(currentZone, pattern, SZM_DELETE);
        }

        [ComImport, GuidAttribute("79EAC9EE-BAF9-11CE-8C82-00AA004BA90B"),
        InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
        public interface IInternetSecurityManager
        {
            [return: MarshalAs(UnmanagedType.I4)]
            [PreserveSig]
            int SetSecuritySite([In] IntPtr pSite);

            [return: MarshalAs(UnmanagedType.I4)]
            [PreserveSig]
            int GetSecuritySite([Out] IntPtr pSite);

            [return: MarshalAs(UnmanagedType.I4)]
            [PreserveSig]
            int MapUrlToZone([In, MarshalAs(UnmanagedType.LPWStr)] string pwszUrl, out UInt32 pdwZone, UInt32 dwFlags);

            [return: MarshalAs(UnmanagedType.I4)]
            [PreserveSig]
            int GetSecurityId([MarshalAs(UnmanagedType.LPWStr)] string pwszUrl, [MarshalAs(UnmanagedType.LPArray)] byte[] pbSecurityId, ref UInt32 pcbSecurityId, uint dwReserved);

            [return: MarshalAs(UnmanagedType.I4)]
            [PreserveSig]
            int ProcessUrlAction([In, MarshalAs(UnmanagedType.LPWStr)] string pwszUrl, UInt32 dwAction, out byte pPolicy, UInt32 cbPolicy, byte pContext, UInt32 cbContext, UInt32 dwFlags, UInt32 dwReserved);

            [return: MarshalAs(UnmanagedType.I4)]
            [PreserveSig]
            int QueryCustomPolicy([In, MarshalAs(UnmanagedType.LPWStr)] string pwszUrl, ref Guid guidKey, ref byte ppPolicy, ref UInt32 pcbPolicy, ref byte pContext, UInt32 cbContext, UInt32 dwReserved);

            [return: MarshalAs(UnmanagedType.I4)]
            [PreserveSig]
            int SetZoneMapping(UInt32 dwZone, [In, MarshalAs(UnmanagedType.LPWStr)] string lpszPattern, UInt32 dwFlags);

            [return: MarshalAs(UnmanagedType.I4)]
            [PreserveSig]
            int GetZoneMappings(UInt32 dwZone, out UCOMIEnumString ppenumString, UInt32 dwFlags);
        }
    }
}


PowerPivot Add-In Excel 2010 Sharepoint 2010

Excel 2010 부터는 PowerPivot 기능이 Add-In 될 수 있습니다.

http://www.powerpivot.com/download.aspx

Setting Up the Development Environment for SharePoint Server(번역:쉐어포인트서버2010 개발환경 구축하기) Sharepoint 2010


대용량 크롤링 로그 제한풀기 SSP(중앙관리)

출처 : http://cafe.naver.com/spsv3/6750

제가 찾은 것은 이것입니다

그리고

디폴트로 크롤링의 파일 사이즈 한계는 16메가 라고 합니다.
이것을 늘이려면 레지스트리를 수정해야 합니다
아래의 작업을 수행합니다
1. regedit 를 실행한다
2. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office Server\12.0\Search\Global\Gathering Manager 로 이동한다
3. Edit - New - DWORD Value  하고.  MaxDownloadSize 라고 이름짓습니다.
4. 노드 추가 후 값을 Decimal 타입으로 하고 원하는 사이즈를 넣습니다
5. 서버를 재시작합니다.
6. 풀 크롤링을 합니다.  

그리고 타임아웃에 대한 조치는 따로 해주어야 하는데
1. 중앙관리 사이트에서 응용프로그램관리 > 검색 > 검색서비스 관리 로 이동합니다
2. 팜-레벨 검색셋팅 으로 이동
3. 타임아웃 세팅에서 Connection and Request acknowledgement time 을 수정합니다

Open Flash Chart .Net Dev

Open Flash Chart .NET Library

Open Flash Chart is the chart component I chose to use at Yesnobox.com. I liked it at first sight because it looks really awesome at the client browsers and doesn’t require generating chart images on server.  It was pity, but at the time I decided to use it in Nov 2007, there were no .NET API to use it. Thanks to many examples at the Open Flash Chart website and API written for other programming languages it seemed that it will be simple enough to write another one for .NET. So I decided to write my own library to build data strings and create handy asp.net web control to place on a page.

Online Demo

Before going in details of how it is works you can test the chart and properties at the demo page.

How to start?

To start using Open Flash Chart you have to download the project and link the dll or the source with you current application.

Download Open Flash Chart object and copy swf file to the ~/Flash/ open-flash-chart.swf on your website. (You can set another location in the FlashUrl property of OpenFlashChart web control)

In order to display chart data you have to register small HttpHandler from library under the <system.web><httpHandlers> node in web.config:

</configuration>

<system.web>

  <httpHandlers>

    <add verb="*" path="of.axd" type="OpenFlashChartLib.OpenFlashChartControlHandler, OpenFlashChartLib" />

  </httpHandlers>

</system.web>

</configuration>

Add Register directive before place the control on the page 

<ofc:OpenFlashChart runat="server" ID="ofcTest" Height="350" Width="500" OnDrawChart="ofcTest_DrawChart" />

Call BuildChart()control’s method to rebuild chart data:

protected void Page_Load(object sender, EventArgs e)

{

    ofcTest.BuildChart();

Define the DrawChart handler in the page code behind. At this event you have to create Graph object, initialize it properties and set diagram values.

protected void ofcTest_DrawChart(object sender, OpenFlashChartLib.DrawChartEventArgs e)

{

    // Create graph object and initialize its display preferences

    Graph graph = new Graph();

    e.Graph = graph;

    graph.Title.Text = "";

    graph.Title.Style.Font.Size = new FontUnit(26, UnitType.Pixel);

    graph.XLabelStyle.Color = "#9933CC";

    graph.XLabelStyle.Size = 10;

    graph.YLegend.Text = "Votes";

    graph.YLegend.Size = 12;

    graph.YLegend.Color = "0x736AFF";

    graph.XLegend.Text = "Your question";

    graph.XLegend.Size = 14;

    graph.XLegend.Color = "0x736AFF";

    graph.YTicks.Size = 2;

 

    // Create new data renderer

    DataRenderer<int> ret = new DataRenderer<int>();

    // Create a chart type wich you want to display

    // as GraphTypeRenderer

    string grColor = "E61C1C";

    int alpha = 60;

    string legentText = "Legend";

    int legentTextHeight = 12;

    ret.GraphTypeRenderer = new BarGraphType(alpha, "#" + grColor, legentText, legentTextHeight);

 

    // Initialize XLables for the data set

    graph.XLabels.Values.Add("Answer 1");

    graph.XLabels.Values.Add("Answer 2");

    graph.XLabels.Values.Add("Answer 3");

    graph.XLabels.Values.Add("Answer 4");

    graph.XLabels.Values.Add("Answer 5");

    // Add Values to display

    ret.Values.Add(3);

    ret.Values.Add(3);

    ret.Values.Add(7);

    ret.Values.Add(12);

    ret.Values.Add(1);

    // Add data rendere to the Graph.Values collection

    graph.Values.Add(ret);

 

    graph.Attributes.Add(new KeyValuePair(Tokens.BackgroundColor, "#FFFFFF"));

}

That’s it. Press F5 and see results:


The flash object is automatically embedded by SWFObject script which is linked to the page from library resources.

If the chart is not pie chart we can add other data sets to display as it is done at http://teethgrinder.co.uk/open-flash-chart/gallery-bar-2.php page. All we have to do is to create another DataRenderer object, init it in the GraphTypeRenderer and add values.

To create 2 data sets on one chart use the following code

using System;

using System.Web.UI.WebControls;

using OpenFlashChartLib;

 

namespace WebDemo

{

    public partial class _Default : System.Web.UI.Page

    {

        protected void Page_Load(object sender, EventArgs e)

        {

            ofcTest.BuildChart();

        }

 

        protected void ofcTest_DrawChart(object sender, OpenFlashChartLib.DrawChartEventArgs e)

        {

            // Create graph object and initialize its display preferences

            Graph graph = new Graph();

            e.Graph = graph;

            graph.Title.Text = "";

            graph.Title.Style.Font.Size = new FontUnit(26, UnitType.Pixel);

            graph.XLabelStyle.Color = "#9933CC";

            graph.XLabelStyle.Size = 10;

            graph.YLegend.Text = "Votes";

            graph.YLegend.Size = 12;

            graph.YLegend.Color = "0x736AFF";

            graph.XLegend.Text = "Your question";

            graph.XLegend.Size = 14;

            graph.XLegend.Color = "0x736AFF";

            graph.YTicks.Size = 2;

 

            // Create new data renderer

            DataRenderer<int> ret = new DataRenderer<int>();

            // Create a chart type wich you want to display

            // as GraphTypeRenderer

            string grColor = "E61C1C";

            int alpha = 60;

            string legentText = "Legend";

            int legentTextHeight = 12;

            ret.GraphTypeRenderer = new BarGraphType(alpha, "#" + grColor, legentText, legentTextHeight);

            // Initialize XLables for the data set

            graph.XLabels.Values.Add("Answer 1");

            graph.XLabels.Values.Add("Answer 2");

            graph.XLabels.Values.Add("Answer 3");

            graph.XLabels.Values.Add("Answer 4");

            graph.XLabels.Values.Add("Answer 5");

            // Add Values to display

            ret.Values.Add(3);

            ret.Values.Add(3);

            ret.Values.Add(7);

            ret.Values.Add(12);

            ret.Values.Add(1);

            // Add rendere to Values collection

            graph.Values.Add(ret);

            graph.YMax = 12;

 

            // if this is not pie chart create another renderer

            if (!graph.PieChart())

            {

                DataRenderer<int> ret2 = new DataRenderer<int>();

                BarGraphType renderer = new GlassGraphType(alpha, "#005231", "", null);

                renderer.Color = "#005231";

                renderer.OulineColor = "#005231";

                ret2.GraphTypeRenderer = renderer;

                ret2.Values.Add(5);

                ret2.Values.Add(12);

                ret2.Values.Add(1);

                ret2.Values.Add(0);

                ret2.Values.Add(8);

                graph.Values.Add(ret2);

            }

            graph.YMax = 12;

            graph.Attributes.Add(new KeyValuePair(Tokens.BackgroundColor, "#FFFFFF"));

 

        }

    }

}

We will get the following pretty chart:


The creation of pie chart does not differ much. The only thing that changes is the is type of GraphTypeRenderer property of the DataRenderer. Use the following code to define Pie chart in the DrawChart event:

// Create new data renderer

DataRenderer<int> ret = new DataRenderer<int>();

// Create a chart type wich you want to display

// as GraphTypeRenderer

string grColor = "E61C1C";

PieGraphType pie = new PieGraphType();

pie.Colors = new List<string>(new string[] { "E61C1C", "462CDE", "3F9735" });

pie.Alpha = 60;

ret.GraphTypeRenderer = pie;

// Initialize XLables for the data set

graph.XLabels.Values.Add("Answer 1");

graph.XLabels.Values.Add("Answer 2");

graph.XLabels.Values.Add("Answer 3");

graph.XLabels.Values.Add("Answer 4");

graph.XLabels.Values.Add("Answer 5");

// Add Values to display

ret.Values.Add(3);

ret.Values.Add(3);

ret.Values.Add(7);

ret.Values.Add(12);

ret.Values.Add(1);

// Add data rendere to the Graph.Values collection

graph.Values.Add(ret);

The result:


Supported features

Now the API supports following chart types:

Chart types:

  • Bar chart
  • Glass chart
  • 3D chart
  • Fade chart
  • Sketch chart
  • Pie chart
  • Line chart (dot line, hollow line)

Ajax panel is also supported. To find out how to use the control there see demo web example.

Download

OpenFlashChartLib project and WebDemo available at CodePlex.

I am not first …

At the moment am writing this article there are two other similar api released. You can find them at Dot NET APIs page of Open Flash Chart Page. The functionality is almost the same except some features I coded here

  • Automatic SWFObject link to the page. The SWFObject is compiled to dll resources and the script include generated automatically.
  • JQuery flash registration. If you are using JQuery it is better to use JQuery flash plug in to embed flash object in the page. It can be set by EmbedScriptType property of OpenFlashChart control.
  • No need to create separate data page or handler you just handle DrawChart event. You can use generic data handler registered in web.config and chart data will be cached between postbacks. Or you can switch this feature off by setting SpecificDataHandler control’s property to any data renderer url.
OpenFlashChart2Lib0.9.zip

ADFS2.0 설치후기 Server구성

ADFS란?

ADFS는 사용자 계정 및 응용 프로그램이 완전히 다른 네트워크나 조직에 있는 경우에도 하나 이상의 보호된 인터넷 연결 응용 프로그램에 대한 완벽한 "단일 프롬프트" 액세스를 가진 브라우저 기반 클라이언트(네트워크 내부 또는 외부)를 제공하는 ID 액세스 솔루션입니다.

응용 프로그램이 한 네트워크에 있고 사용자 계정이 다른 네트워크에 있을 경우 일반적으로 사용자가 응용 프로그램에 액세스하려고 할 때 보조 자격 증명을 묻는 메시지가 표시됩니다. 이러한 보조 자격 증명은 응용 프로그램이 상주하는 영역의 사용자 ID를 나타냅니다. 일반적으로 응용 프로그램을 호스팅하는 웹 서버에서 가장 적절한 권한 부여 결정을 내리는 데 이러한 자격 증명이 필요합니다.

ADFS는 트러스트된 파트너에 대한 사용자의 디지털 ID 및 액세스 권한을 보호하는 데 사용할 수 있는 트러스트 관계를 제공함으로써 보조 계정 및 해당 자격 증명을 불필요하게 만듭니다. 페더레이션 환경에서 각 조직은 계속해서 자신의 고유한 ID를 관리하지만 다른 조직의 ID도 안전하게 반영하고 수락할 수 있습니다.

또한 트러스트된 파트너 조직 간에 B2B(business-to-business) 트랜잭션을 보다 쉽게 이용하도록 페더레이션 서버를 여러 조직에 배포할 수 있습니다. 페더레이션 B2B 파트너 관계는 비즈니스 파트너를 다음 조직 유형 중 하나로 인식합니다.

참조 : https://connect.microsoft.com/site642    (설치파일은 이사이트에 있습니다. -- AD FS 2.0 -- WIF SDK)
http://blogs.msdn.com/card/archive/2010/01/27/customizing-the-ad-fs-2-0-sign-in-web-pages.aspx


설치방법 : AD_FS_2_0_Step-by-Step_Guide_-_Federation_with_WIF.pdf

결론 :
ADFS2.0은 MS Framework 위에서 생성하는 SSO 기능으로 봐야합니다.
처음엔 ADFS를 통해 Excel Web Service가 도메인 참여하지 않고도 새로운 데이터를 가져올 수 있지않을까 싶어서 기술검토를 시도해 보았지만, 위에 정의한 것처럼 역시 ADFS는 자격증명을 통합(SSO)하는 기능외에 EWS에서 필요한 2Hop 인증방식(Kerberos)까지는 지원하지 않는 것으로 확인되었습니다.


장애내용

네트워크 인증에 Kerberos 및 NTLM 프로토콜을 모두 지원하도록 IIS를 구성하는 방법 AD


Hyper-V R2.. (2) - Windows Server 2008 R2에서는… Server구성

Virtual Disk = Disk Cache = Enable

지난 Hyper-V R2 (1) 편에서, Live Migration이라는 단어에 대해서 간단히 소개를 해드렸습니다. 크게 보았을 때, 서비스의 중단 없이.. 이를 타 노드로 장애 조치 시켜주는 기능이죠. 여기서 한가지 정의를 확실히 해야 할 단어가 있습니다.

바로 “서비스의 중단” 이라는 단어입니다.

노드의 장애 조치시, 장애 조치의 총 소요 시간이 TCP 연결에 대한 타임아웃(Timeout) 시간 이내에 발생하고, 노드 이전후, 네트워크 연결을 변경된 노드에서 처리하기 위한 ARP(Address Resolution Protocol) 업데이트까지 발생해야 합니다.

TCP 프로토콜은 특징상, 전송된 패킷에 대해, 확인(Ack)를 받으므로, 특정 시간내에 확인이 오지 않으면, 이에 대해 재전송을 하게 되며, 이 재전송이 특정 횟수가 넘어가게 되면, TCP 연결에 대한 타임아웃으로 간주하게 됩니다.

Windows Server 2008 R2의 장애 조치 클러스터는 이러한 빠른 장애 조치를 위해 CSV라는 클러스터 공유 볼륨을 사용합니다. 1편에서 설명드린 것과 같이, 모든 노드에서 공통적으로 접근 가능한 노드이며, 해당 리소스에 대한 소유자만 특정 한 노드를 지정해놓는 것이죠. 필요시 리소스에 대한 소유자만 변경하여, 타 노드로의 이전이 매우 빠르게 가능합니다. Centipede File System이라는 이름으로 알려져 있던 기술이 바로 CSV(Cluster Shared Volumes)입니다.

Windows Server 2008 R2 M3(6801 빌드)에서 CSV 기능은 기본적으로 잠김 상태, 다시 말씀드려 사용할 수 없는 상태입니다. 이를 활성화하시려면, PowerShell v2 또는 명령어 프롬프트에서 명령어를 하나 실행하셔야 합니다.

Live Migration을 구축하시기 위한 방법론은 다음과 같습니다.

1. 최소 두대의 노드에 동일한 버전의 Windows Server 2008 R2를 설치합니다.

2. 노드와 스토리지와의 연결을 처리합니다.(SAN, iSCSI)

3. 노드에 모두 Hyper-V 역할을 설치합니다. 그리고 설치 완료 후, 장애 조치 클러스터 기능을 설치합니다.

image image

장애 조치 클러스터 관리 도구를 열어보시면, 아래의 그림과 같이 CSV가 나타나지 않습니다.

image

4. 해당 기능을 활성화하기 위해서, 언급한 바와 같이 PowerShell v2, 또는 명령어 프롬프트에서..(차후 정식 베타에서는 별도의 링크로 활성화가 가능해질 예정입니다.)

image PowerShell v2

Cluster.exe /prop EnabledSharedVolumes=1 (명령어 프롬프트)

를 입력하신 후, 다시 장애 조치 클러스터 관리 도구를 여시면, CSV가 보여집니다.

자.. 그럼 이제, 하실 일은 무엇일까요?

5. 클러스터 셋트에 보통 저장소를 추가하듯이, Storage를 추가합니다.

단, CSV로 추가될 저장소는 디스크 관리자에서, 해당 디스크를 온라인화시키고, 초기 구성 후, 파티션 작업, 그리고 포맷을 할때, 드라이브명을 별도로 부여할 필요가 없습니다. 드라이브명의 부족으로 추가적인 환경을 구축할 수 없는 케이스가 많았기 때문에, 해당 저장소에 대한 접근은 Volume GUID를 사용하게 됩니다.

image 

현재, 포스팅을 위해 사용한 저장소는 총 4개입니다.

image

6. 해당 저장소를 Storage에서 추가하신 후, 해당 저장소를 CSV로 추가하시는 작업을 해주시면, CSV 환경 구축은 완료되게 됩니다.

image

또 포스팅이 길어지는군요, 말씀드린 데로, Hyper-V R2의 Live Migration 기능에 대한 포스팅은 총 3편으로 구성될 예정입니다. 마지막으로 해당 저장소를 CSV에 추가하신 후, Windows 탐색기에서 C 드라이브에 가시면,

image

클러스터 저장소 4개가 마치 단축 아이콘처럼, 배정되어져 있죠. 클러스터 셋트내 모든 노드에서 똑같은 형태로 모두 보이고, 접근이 가능합니다. 감이 오시죠?

해당 경로에 VM을 설치하시거나, VHD 파일을 복사하시면, 모든 노드에서 접근이 가능해진다는 의미입니다. 이제 Live Migration을 구축하기 위한, 클러스터링의 구축은 모두 마쳤습니다. 이제 Hyper-V 관리 도구를 여시고, 해당 경로에, 가상 머신을 설치만 하면 되겠죠. 다음 포스팅에서는 Live Migration의 아키텍쳐에 대해서 살펴보겠습니다.

출처 : http://blogs.technet.com/koalra/archive/2008/11/24/hyper-v-r2-2-windows-server-2008-r2.aspx


내작업이관(도메인) AD

도메인 참여 전에 로컬 컴퓨터에서 [시작] - [프로그램] - [보조프로그램] - [시스템 도구] - [파일 및 설정 전송 마법사]을 클릭합니다.





















마법사가 시작됩니다.


















이전 컴퓨터에 체크합니다.


















[기타]에 체크하고 저장할 파일 경로를 선택합니다.




















[내 작업]환경만 이전하려면 [설정만]에 체크하고, 전체를 이전하려면 [파일 및 설정 모두]에 체크합니다.
















추가로 파일을 이전하고 싶으면, 다음화면에서 추가하면 됩니다.
















도메인명(컴퓨터이름) 변경하기 AD

netdom computername currentFQDN /add:newFQDN
netdom computername currentFQDN /makeprimary:newFQDN

reboot

netdom computername newFQDN /remove:currentFQDN



출처 : http://technet.microsoft.com/ko-kr/library/cc782761(WS.10).aspx


Windows 2008 Server에서 도메인 변경하기 Server구성

1. 시작 --> 실행 --> cmd --> rendom /list

XML file(Domainlist.xml)이 생성된다. (생성위치는 C:\Users\Administrator 등이다.)

2. 해당 XML화일을 Notepad로 열어서 ForestDNSZones, DomainDNSZones, Netbios name 등의 값을 새로운 도메인 명으로 변경해준다.
From the command prompt, I started out by running rendom /list which outputs an XML file (Domainlist.xml) to the directory where rendom resides. You edit that file to change your domain configuration to the new domain name. i.e ForestDNSZones, DomainDNSZones, Netbios name. See referenced link for details.

After you have modified the file you can run rendom /showforest which shows you the future configuration, verify and make changes if necessary.

Upload the changes you have made in the XML file: Run rendom /upload

Verify readiness of Domain Controller(s): Run rendom /prepare

Execute domain rename instructions: Run rendom /execute

After thats finishes up successfully, you should also run GPFIXUP tool to fix up GPO references to your old domain name. See Step 12 of this document.

Here is an example :

C:\Users\Administrator>gpfixup /olddns:08r2.lab /newdns:mcts.lab
Group Policy fix up utility Version 1.1 (Microsoft)

Start fixing group policy (GroupPolicyContainer) objects:
……..

Start fixing site group policy links:
.

Start fixing non-site group policy links:
….
gpfixup tool executed with success.

C:\Users\Administrator>gpfixup /oldnb:08r2 /newnb:mcts
Group Policy fix up utility Version 1.1 (Microsoft)

Start fixing group policy (GroupPolicyContainer) objects:
..
gpfixup tool executed with success.

Lastly, run rendom /clean

The identity (domain GUID) of the renamed domain does not change during a domain rename operation. Thus a computer’s domain membership does not change as a result of the holding domain being renamed.

However, every member computer joined to the renamed domain needs to be rebooted twice. Please refer to “How Domain Rename works” technical reference for more info.

How Domain Rename Works : Microsoft Technet

Other References:

http://dsg.port.ac.uk/~hx/rename_domain/index.php

http://www.msexchange.org/tutorials/Domain-Rename.html (for domains with Exchange)


Body & Note Width = 100 주기 Sharepoint Tip

Elements.xml 

<Field ID="{84A7A4D7-3604-45da-AFBB-DDE138EF1257}"
        Type="Note"
        Name="KMSBody"
  Required="FALSE"
        SourceID="http://schemas.microsoft.com/sharepoint/v3"
        StaticName="KMSBody"
        Group="uSharePoint"
  IsolateStyles="TRUE"
  RichText="TRUE"
  RichTextMode ="FullHtml"
  NumLines="15"
  DisplaySize="85"
  RestrictedMode="FALSE"
  DisplayName="본 문">
 </Field>

 

schema.xml

   <Field ID="{84A7A4D7-3604-45da-AFBB-DDE138EF1257}"
    Name="KMSBody"
    SourceID="http://schemas.microsoft.com/sharepoint/v3"
    StaticName="KMSBody"
    Group="eNovatorCPS"
    DisplayName="본 문"
    IsolateStyles="TRUE"
    DisplaySize="85"
    RichText="TRUE"
    RichTextMode ="FullHTML"
    Required="FALSE"
    NumLines="15"
    RestrictedMode="FALSE"
    Description="KMS 게시판용 본문입니다."
    Type="Note">
   </Field>


Multiple Web Front-end Servers에서 중앙관리 호스팅 SSP(중앙관리)

서버 팜을 구성할때 각각의 Front-end 서버에서 중앙관리를 호스팅 하고 싶은데..
 Sharepoint를 기본으로 설치, 배포를 하면 처음 호스팅 되었던 중앙관리 사이트로만 Url이 지정되어 버린다.
(배포시 해당 서버에서 중앙관리를 호스팅 한다고 설정 해도 말이다!!)

이때는 아래의 레지스트리를 수정해 주자!!

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\12.0\WSS\CentralAdministrationURL

출처 : http://blogs.technet.com/wbaer/archive/2007/08/30/sharepoint-3-0-central-administration-url-on-multiple-web-front-end-servers.aspx

원본 : http://qtbabe.egloos.com/4517031

도메인 그룹 정책[신뢰할 수 있는 사이트 추가] AD

Office 웹 사이트를 신뢰할 수 있는 사이트 영역에 추가 정책을 만듭니다. 이렇게 하려면 로컬 정책을 만들거나 도메인 또는 조직 구성 단위에 정책을 만들 수 있습니다. 도메인에서 정책을 만들려면 다음을 수행합니다.
  1. 도메인 컨트롤러에 로그온한 후 다음 Active Directory 사용자 및 컴퓨터 유틸리티를 시작하십시오.
  2. 도메인 또는 조직 구성 단위 그룹 정책 개체를 만들 위치를 마우스 오른쪽 단추로 클릭한 다음 속성 을 클릭하십시오.
  3. 그룹 정책 탭을 클릭한 다음 새로 만들기 를 클릭하십시오.
  4. 새 그룹 정책 개체 상자에 설명이 포함된 이름을 입력합니다 (예를 들어, 입력 OfficeUpdate 정책) 다음 Enter 키를 누릅니다.
  5. 이 정책은 특정 사용자나 그룹에 적용되지 않도록 하려면:
    1. 속성 을 클릭한 다음 보안 탭을 클릭하십시오.
    2. 사용자 또는 그룹을 방지하기 위해 이 정책을 적용하지 않고도 추가하십시오.
    3. 해당 사용자 또는 그룹에 대한 읽기인증된 사용자에 대한 사용 권한 목록의 허용 열에서 그룹 정책 적용 확인란 선택을 취소하십시오.
    4. 확인 을 클릭하십시오.
  6. 편집 을 클릭하십시오.
  7. 사용자 구성 아래의 Windows 설정, Internet Explorer 유지 관리 를 차례로 확장한 다음 보안 을 누릅니다.
  8. 오른쪽 창 보안 영역 및 컨텐트 등급, 마우스 오른쪽 단추로 클릭한 다음 속성 을 클릭하십시오.
  9. 현재 보안 영역 및 개인 정보 설정 가져오기 를 누르고 해당 보안 강화 구성 기능을 없고 설정 수정을 클릭합니다 컴퓨터에서 이러한 설정이 무시됩니다 메시지 내용의 읽은 후 계속 을 클릭하십시오.
  10. 신뢰할 수 있는 사이트 를 누른 다음 사이트 를 클릭하십시오.
  11. 영역에 웹 사이트 추가 상자에 http://officeupdate.microsoft.com 을 입력한 다음 추가 클릭하십시오.
  12. 영역에 웹 사이트 추가 상자에 http://office.microsoft.com 을 입력한 다음 추가 클릭하십시오.
  13. 닫기 를 누른 다음 확인 을 누릅니다.
  14. 보안 영역 및 컨텐트 등급 대화 상자에서 확인 을 클릭하십시오.
  15. 파일 메뉴에서 끝내기 를 누릅니다.
  16. 닫기 를 누른 다음 정책은 도메인 전체에 전파할 수 있는 충분한 시간을 허용하십시오.

닷넷 배포 프로젝트를 만들어 보자 .Net Dev

안녕하세요? 맨날맑음 입니다.

.NET 으로 프로젝트를 만들고, 배포를 하는 방법은 Click Once같은 방법도 있지만 이번에는 Windows Installer 배포에 대해 알아보겠습니다. 기존에 .Net으로 프로젝트 개발만 해보았지, 배포는 신경을 쓰지 않아 잘 모르다가, 이번에 VS2008에서 기본으로 제공되는 배포 프로젝트의 사용법을 알아 보았습니다.
아래 링크를 따라가면 배포프로젝트에 관한 MSDN 도움말을 보실 수 있습니다.
http://msdn.microsoft.com/ko-kr/library/206sadcd(VS.80).aspx

우선 배포할 프로그램을 준비합니다. 저는 간단한 윈폼 프로젝트로 하겠습니다.

VS2008에서 새 프로젝트를 추가 하고, 기타 프로젝트 형식 -> 설치 및 배포 -> 설치프로젝트를 선택합니다.

다음과 같이 배포 프로젝트가 생성됩니다.

솔루션 탐색기와 속성 창을 보면 아래와 같이 프로젝트와, 여러 속성이 보이게 됩니다.
이제 이 속성들의 의미를 하나하나 알아보겠습니다.
▷AddRemoveProgramIcon : 제어판 -> 프로그램 추가/제거에 표시될 아이콘을 등록합니다.
▷Author : 프로젝트 작성자의 이름을 등록합니다.
▷Desciption : 설치 관리자에 관한 설명을 등록합니다.
▷DetectNewerInstalledVersion : 프로그램 설치시 버전 비교를 통해 새 버전인지 확인 해 줍니다. 이미 설치 되있을 경우 설치 되어있다고 알려주기도 합니다.
▷Keyword : 설치 관리자를 검색하는데 사용 할 키워드를 지정합니다.
▷Localization : 로케일을 적용한다고 하는데, 글로벌 프로그램이 아니라면 신경 안써도 될 듯 합니다.
▷Manufacturer : 제조업체의 이름을 지정합니다
▷MunufacturerUrl : 제조업체의 홈페이지 링크를 지정.
▷PostBuildEvent : 배포프로젝트를 빌드한 후에 실행 할 명령줄을 지정합니다.
▷PreBuildEvent : 배포프로젝트를 빌드하기 전에 실행 할 명령줄을 지정합니다.
▷ProductCode : 응용프로그램의 고유 식별자(GUID)를 지정합니다.
▷ProductName : 프로그램의 공개 이름을 지정합니다.
▷RemovePrevionsVersions : 설치시 이전버전을 삭제 할지를 지정합니다.
▷RunPostBuildEvent : PostBuildEvent 속성에서 지정된 명령줄을 실행할 시기를 결정합니다.
▷SearchPath : 개발 컴퓨터의 어셈블리, 파일 또는 병합 모듈을 검색하는 데 사용되는 경로를 지정합니다.
Subject : 프로그램을 설명하는 추가정보를 지정합니다.
▷SupportPhone : 전화번호를 지정합니다.
▷SupportUrl : 마찬가지로 추가 설명을 하는 웹사이트 주소
TargetPlatform : 프로그램이 실행될 플랫폼을 지정.
▷Title : 설치 관리자의 제목을 지정합니다.
▷UpgradeCode : 프로그램 버전이 여러가지 일때 고유식별자를 지정합니다.
▷Virsion : 버전을 지정합니다.




속성 참 많네요.. 정작 중요한건 ProductName, Title, Author, MAnufacturer 정도 입니다.

이제 파일시스템 탭으로 이동하여 대상 컴퓨터의 파일 시스템 -> 응용 프로그램 폴더를 선택한 후 속성창을 확인합니다.

DefalutLocation이라는 속성에 [ProgramFilesFolder][Manufacturer]\[ProductName] 라고 되어 있습니다. 인스톨시 프로그램이 설치될 폴더 인데요. 이 설정으로 하게 되면 프로그램파일 폴더 밑에 제조회사명 밑에 프로그램 이름 폴더 안에 깔리게 되겠습니다. 맘에 드는 폴더로 변경 하시면 됩니다.

이제 파일을 추가 해 보겠습니다. 응용 프로그램 폴더에서 마우스 오른쪽 버튼을 누르면 파일이나 폴더등을 추가 할 수 있습니다. 미리 만들어 놓은 샘플 어플리케이션을 추가 하겠습니다.


이렇게 하면 앞서 지정된 설치 폴더에 MainApp.exe가 설치 됩니다. 명색이 인스톨 프로그램인데 이것만 지정하면 안되겠죠? 위에 사용자 바탕화면사용자 프로그램 메뉴가 보입니다.
말 그래로 사용자 바탕화면은 바탕화면에 설치 될 파일을 지정 할 수 있고, 사용자 프로그램 메뉴는 [시작]->[프로그램]의 폴더나 파일을 지정 할 수 있습니다.
바탕화면과 프로그램 메뉴에 MainApp.exe의 바로가기를 넣어주면 클라이언트가 아주 편리 할 것 같습니다.
MainApp.exe를 마우스 오른쪽 버튼으로 클릭하여 바로가기를 만듭니다. 저는 두개를 만들어 이름을 원하는데로 변경한 후 하나는 사용자 바탕화면으로 끌어다 놓았고, 사용자 프로그램 메뉴에는 [새폴더]를 하나 추가 하여, 그 안에 넣었습니다. 그리고 아이콘 파일(.ico)도 하나 추가하여 바로가기의 속성중 Icon에 연결 시켜 줍니다. 그럼 바로가기가 우리가 지정한 아이콘으로 생성 됩니다.

이제 언인스톨 기능을 하는 바로가기도 지원해 주어야 좀 더 있어보일 것입니다.
바탕화면에서 텍스트문서(txt)를 하나 추가해서 확장자를 bat로 바꾸어 줍니다. 편집기로 파일을 열어 Msiexec /x {ProductCode} 를 추가 해 줍니다. 여기서 ProductCode는 위에 프로젝트 속성중에 있던 코드 입니다. 지금 예제 대로 하면 Msiexec /x {A1715BBB-A953-4F01-B788-168542ED2BC3} 이 되겠네요.

현재 배포하는 샘플 프로그램이 매우 간단하여 파일이 하나이지만, 대부분의 응용은 여러 DLL을 포함하고 있을것입니다. 그리고 각 파일마다 설치하고 싶은 경로가 다를 수 있는데, 파일시스템 탭의 대상 컴퓨터의 파일 시스템을 오른쪽 버튼으로 누르면 특수폴더 추가에서 원하는 폴더를 추가 할 수 있습니다.

이제 이 파일을 응용프로그램 폴더에 포함 시켜주고, 마찬가지 방법으로 바로 가기를 만들어서 원하는 곳에 추가 시켜 줍니다. 프로젝트를 다시 빌드 하고 테스트 해보겠습니다. 프로젝트 폴더의 Relese 폴더에 들어가니 파일이 두개 보입니다.(Relese모드로 빌드 했을 경우, Debug 모드 일경우 Debug 폴더에 생성)
Setup.exe를 더블 클릭하니 설치가 잘 됩니다.
설치시 생긴 바로가기 아이콘으로 Uninstall도 잘되는지 확인해 보겠습니다.
정상적으로 잘 되는걸 볼 수 있습니다. 쓰다 보니 스크롤의 압박이군요;
만약 설치 대상컴퓨터(클라이언트)에 .Net Framwork가 없을때 자동으로 설치되게 하는 것 까지 쓰려고 했는데,
다음편으로 넘겨야 할 것 같습니다. 다음편에는 이같은 기능을 해주는 Boot Strapper에 관해 포스팅 하겠습니다.

출처 : http://hoons.kr/Lecture/LectureView.aspx?BoardIdx=25480&kind=20

IP 꼬였을 때... Server구성

- Command 창에

netsh int ip reset

WSS 3.0 / MOSS 서비스 계정 변경 및 비밀번호 변경 SSP(중앙관리)

[주제]

MOSS 설치 이후 정책에 의해서 서비스 계정 변경 혹은 비밀번호를 변경 해야 하는 경우가 있습니다. 이에 대한 해결 방법에 대해 설명 합니다.

  1. MOSS 관련 서비스 계정을 변경 하는 경우
  2. MOSS 관련 서비스 계정의 비밀번호를 변경 하는 경우

[절차]

  • Web Application 의 Application Pool 실행 계정 변경
    1. “중앙관리” > “작업” > “서비스 계정”
    2. “자격 증명 관리” 의 “웹 응용 프로그램 풀” 을 선택 “웹 서비스” 를 선택 하고 “응용 프로그램 풀” 에서 Web Application 명을 선택 한다.
      image
    3. “보안 계정 구성”을 선택 하고 “사용자 이름”, “암호” 를 수정 한다.
    4. 변경 사항은 자동으로 모든 Web Front-end server에 적용 됩니다.
  • SharePoint Centeral Administration ( SCA , 중앙관리 사이트 ) 의 Application Pool 실행 계정 변경
    1. 실행 > cmd 명령창 실행
    2. 다음 명령을 실행 합니다.
      "%commonprogramfiles%\Microsoft Shared\Web server extensions\12\BIN\Stsadm.exe" -o updatefarmcredentials -userlogin domain\username -password password
    3. iisreset –noforce 을 실행 합니다.
  • MOSS Search 의 Default Content 접근 계정 변경
    1. “중앙관리” > “공유 서비스 관리” > “SharedServices1”
    2. “검색” > “검색 설정” > “기본 컨텐츠 액세스 계정”
    3. “계정”, “암호”,”암호 확인” 을 수정 합니다.
      image
  • MOSS Search Service 계정 변경
    1. “중앙관리” > “서버 제공 서비스” > “Office SharePoint Server 검색” 클릭
    2. “팜 검색 서비스 계정” 란의 “사용자 이름”, “암호” 를 수정 합니다.
      image

[TIP]

다음과 같은 스크립트를 사용 하면 자동으로 비밀번호 변경 작업이 가능 합니다.

  1. 아래의 스크립트를 메모장에 붙여넣고 스크립트를 적절히 수정 합니다.
    ( ex : “SharedServices1”, “Default Web Site” 의 이름 등을 확인 )
  2. FileName.bat 파일로 저장합니다.
  3. 실행 > cmd 명령창을 실행 하고 다음 명령을 실행 합니다.
    FileName.bat DomainName\UserName NewPassword

@echo off
rem other app pools
echo *** Updating app pool passwords
"%commonprogramfiles%\Microsoft Shared\Web server extensions\12\BIN\Stsadm.exe" -o updateaccountpassword -userlogin %1 -password %2 -noadmin
rem central admin
echo *** Updating Central Admin password
"%commonprogramfiles%\Microsoft Shared\Web server extensions\12\BIN\Stsadm.exe" -o updatefarmcredentials -userlogin %1 -password %2
rem ssp - new
echo *** Updating ssp password for new installs
"%commonprogramfiles%\Microsoft Shared\Web server extensions\12\BIN\Stsadm.exe" -o editssp -title "SharedServices1" -ssplogin %1 -ssppassword %2
rem ssp - upgrade
echo *** Updating ssp password for upgraded installs
"%commonprogramfiles%\Microsoft Shared\Web server extensions\12\BIN\Stsadm.exe" -o editssp -title "Default Web Site" -ssplogin %1 -ssppassword %2
rem osearch
echo *** Updating osearch password
"%commonprogramfiles%\Microsoft Shared\Web server extensions\12\BIN\Stsadm.exe" -o osearch -farmserviceaccount %1 -farmservicepassword %2
echo *** MANUAL UPDATE NEEDED. To update the password, visit the SSP Web application page, click Search Settings, and then click Default Content Access Account.
rem spsearch
echo *** Updating spsearch password
"%commonprogramfiles%\Microsoft Shared\Web server extensions\12\BIN\Stsadm.exe" -o spsearch -farmserviceaccount %1 -farmservicepassword %2
echo *** Updating spsearch content access account
"%commonprogramfiles%\Microsoft Shared\web server extensions\12\BIN\stsadm.exe" -o spsearch -farmcontentaccessaccount %1 -farmcontentaccesspassword %2
rem restarting IIS
echo *** Doing soft restart of IIS
iisreset /noforce
echo on

[참고 사이트]

  1. How to change service accounts and their passwords in MOSS and WSS 3.0
    http://weblogs.asp.net/erobillard/archive/2007/07/06/how-to-change-service-accounts-and-their-passwords-in-moss-and-wss-3-0.aspx
  2. How to change service accounts and service account passwords in SharePoint Server 2007 and in Windows SharePoint Services 3.0
    http://support.microsoft.com/kb/934838

출처 : http://blogs.technet.com/koeos/archive/2009/03/19/wss-3-0-moss.aspx


.aspx WebPart

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="FileList.aspx.cs" Inherits="WEB_FileList" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>제목 없음</title>
    <script type="text/javascript">
    var sEditorUrl = "<%= s_Domain %>Common/InnoFD/";
    // Editor CAB 파일 절대경로지정
    var InnoFD_Cab = sEditorUrl + "InnoFD5.cab";
    </script>
   
    <script type="text/javascript" src="<%= s_Domain %>Common/InnoFD/InnoFD.js"></script>
   
    <script>
        function runClickMenu(downfile, fileName, sFileID)
        {
            if(document.getElementById("hd_UserRole").value == "True ")
            {
                if(eval(sFileID) > 0)
                {
                    var sFileName = "<%= s_Domain %>" + downfile;
                    //document.InnoFD.SingleDownload("<%= s_Domain %>" + downfile, fileName);
                   
                    document.getElementById("hd_DownFileID").value = sFileID; 
                    // 리스트의 파일 전체 제거
                    document.InnoFD.RemoveAllFiles();


                    // 리스트에 파일 추가
                    document.InnoFD.AppendFile(sFileName);


                    // 다운로드 실행
                    document.InnoFD.StartDownload();
 
                }
                else
                    alert("첨부파일이 잘못되어 다운로드 할 수 없습니다.");
                   
            }
            else
                alert("현재 권한으로는 다운로드 받으실 수 없습니다.");
        } 
       
       
        function FileHistory(File_id, File_Name)
        {
            window.open("FileHistory_Pop.aspx?FileID=" + File_id+ "&fileName="+File_Name , "FileHistory", "toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=0,resizable=0,width=487,height=318");
        }
       
    </script>
   
<style type="text/css">
    .eText{
    color:#000000;
    font-family:Gulim, verdana;
    font-size:9pt;
    margin:0px 0px 0px 0px;
    font-weight:normal;
    }

A:link {color: #393939;text-decoration: none }
A:hover { color: #3399ff; text-decoration: underline }
</style>
   
</head>
<body topmargin="2" bottommargin="0" leftmargin="4" rightmargin="0">
    <form id="form1" runat="server">
    <input type="hidden" id="hd_FileID" runat="server" />
    <input type="hidden" id="hd_Name" runat="server" />
    <input type="hidden" id="hd_Post" runat="server" />
    <input type="hidden" id="hd_Position" runat="server" />
    <input type="hidden" id="hd_DownFileID" runat="server" />
    <input type="hidden" id="hd_UserRole" runat="server" />
    <input type="hidden" id="hd_ListID" runat="server" />
    <div class="eText">
        <span id="spanAttachFileList" style="height:110px" runat="server" />
    </div>
    <script for="InnoFD" event="OnDownloadComplete">
    //<!--
        // 전송 완료시 필요한 코드를 넣으시면 됩니다.
        // 필요없을 경우 생략하셔도 됩니다.
        javascript:__doPostBack('<%=lbt_History.UniqueID %>','');
    //-->
    </script>
    <script>
        LoadInnoFD(1,1);
    </script>
   
    <asp:LinkButton ID="lbt_History" runat="server" OnClick="lbt_History_Click"></asp:LinkButton>
   
   
    </form>
</body>
</html>

================================================================================================================

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Text;

using System.Data.SqlClient;
using CommDBMgr;
using File.Biz;


public partial class WEB_FileList : System.Web.UI.Page
{
    public string s_Domain;
    protected void Page_Load(object sender, EventArgs e)
    {
        s_Domain = ConfigurationManager.AppSettings.Get("DomainName");

        if (!IsPostBack)
        {
            if (Request.QueryString["ID"] != null)
                this.hd_FileID.Value = Request.QueryString["ID"];

            //if (Request.QueryString["UserName"] != null)
            //    this.hd_Name.Value = Request.QueryString["UserName"];

            //if (Request.QueryString["UserDept"] != null)
            //    this.hd_Post.Value = Request.QueryString["UserDept"];

            //if (Request.QueryString["UserTitle"] != null)
            //    this.hd_Position.Value = Request.QueryString["UserTitle"];

            if (Request.QueryString["UserRole"] != null)
                this.hd_UserRole.Value = Request.QueryString["UserRole"];

            if (Request.QueryString["UserNameTitleDept"] != null)
                this.hd_Name.Value = Request.QueryString["UserNameTitleDept"];

            if (Request.QueryString["ListID"] != null)
                this.hd_ListID.Value = Request.QueryString["ListID"];

            //this.hd_FileID.Value = "14";
            //this.hd_ListID.Value = "68454a56-3fa6-45e4-a36f-0d61ed329b20";
            getFileList();
        }
    }

    private void getFileList()
    {
        DataTable dt = null;

        if (this.hd_FileID.Value.Length > 0)
        {
            using (File_NTx oFile = new File_NTx())
            {
                dt = oFile.GetFileList(ConfigurationManager.AppSettings.Get("ConnectionFile"), this.hd_FileID.Value, this.hd_ListID.Value);
            }

            if (dt != null)
            {
                if (dt.Rows.Count > 0)
                {
                    spanAttachFileList.InnerHtml = sGetAttachFileList(dt);
                }
            }
        }
    }


    private string sGetAttachFileList(DataTable dt)
    {
        int ii;
        string sFileDomain = ConfigurationManager.AppSettings.Get("DomainName_Img");
        string sFileUrl;
        string sFileUrl1;
        string sFileName;
        string sOFileNAme;
        string sFileType;
        string sFileSize;
        string sFileID;
        int sFILE_CNT;
        string sExet;
        StringBuilder sb = new StringBuilder();
        string sMultiFiles = string.Empty;

        sb.Append("<div style=\'overflow-y:auto;height:110px\'>");
        if ((dt == null) == false)
        {
            if (dt.Rows.Count > 0)
            {
                for (ii = 0; ii <= dt.Rows.Count - 1; ii++)
                {
                    sFileID = dt.Rows[ii]["FILE_IDX"].ToString();
                    sFileUrl = dt.Rows[ii]["FILE_PATH"].ToString();
                    sFileName = dt.Rows[ii]["FILE_NAME"].ToString();

                    sFileUrl1 = sFileUrl + sFileName;

                    sOFileNAme = dt.Rows[ii]["FILE_ORIGIN_NAME"].ToString();
                    sFileType = dt.Rows[ii]["FILE_TYPE"].ToString();
                    sFILE_CNT = Convert.ToInt32(dt.Rows[ii]["FILE_CNT"].ToString());
                    //확장자
                    sExet = sOFileNAme.Substring(sOFileNAme.IndexOf(".") + 1, sOFileNAme.Length - sOFileNAme.IndexOf(".") - 1).ToLower();

                    sFileType = GetFileType(sFileType.Split('-')[0].ToString());
                    sFileType = "<img src=\"" + sFileDomain + sFileType + "\" border=\"0\" />";

                    if (sFILE_CNT > 0)
                    {
                        sFileSize = "( <a href=\'#1\' onclick=\"FileHistory('" + sFileID + "', '" + sFileName.Split('_')[0] + "');\">" + sFILE_CNT.ToString() + "회</a> )";
                    }
                    else
                    {
                        sFileSize = "";
                    }

                    //Inno 멀티 다운로드
                    sFileUrl = "\"javascript:runClickMenu(\'" + sFileUrl1 + "\', \'" + sOFileNAme + "\', \'" + sFileID + "\');\"";
                    if (sFileUrl != "")
                    {
                        //싱글 다운로드를 위한 HTML
                        sb.Append(System.Convert.ToString(ii + 1) + (".&nbsp;&nbsp;<a href=\'#1\' onclick=" + sFileUrl + " style=\'cursor:hand\'>") + sFileType + sOFileNAme + "</a> " + sFileSize + " <br>" + "\r\n");

                        //멀티 다운로드 용
                        if (ii == dt.Rows.Count - 1)
                        {
                            sMultiFiles += sFileUrl1;
                        }
                        else
                        {
                            sMultiFiles += sFileUrl1 + ":";
                        }

                    }
                }

                //sb.Append("<script>javascript:fnMultiDW(\'" + sMultiFiles + "\')</script>");


            }
        }
        sb.Append("</div>");
        return sb.ToString();
    }

    private string GetFileType(string sType)
    {
        string str_FileType = string.Empty;
        switch (sType.ToLower())
        {
            case "gif":
                str_FileType = "ICGIF.GIF";
                break;
            case "jpe":
                str_FileType = "ICJPE.GIF";
                break;
            case "jpeg":
                str_FileType = "ICJPEG.GIF";
                break;
            case "jpg":
                str_FileType = "ICJPG.GIF";
                break;
            case "txt":
                str_FileType = "ICTXT.GIF";
                break;
            case "xls":
                str_FileType = "ICXLS.GIF";
                break;
            case "xlsx":
                str_FileType = "ICXLSX.GIF";
                break;
            case "aspx":
                str_FileType = "ICASPX.GIF";
                break;
            case "asp":
                str_FileType = "ICASP.GIF";
                break;
            case "bmp":
                str_FileType = "ICBMP.GIF";
                break;
            case "config":
                str_FileType = "ICCONFIG.GIF";
                break;
            case "doc":
                str_FileType = "ICDOC.GIF";
                break;
            case "docx":
                str_FileType = "ICDOC.GIF";
                break;
            case "dot":
                str_FileType = "ICDOT.GIF";
                break;
            case "dotx":
                str_FileType = "ICDOT.GIF";
                break;
            case "zip":
                str_FileType = "ICZIP.GIF";
                break;
            case "ppt":
                str_FileType = "ICPPT.GIF";
                break;
            case "pdf":
                str_FileType = "ICPDF.GIF";
                break;
            default:
                str_FileType = "ICHLP.GIF";
                break;
        }

        return str_FileType;
    }


    private void InsertFileHistory()
    {
        int sFile_Id = Convert.ToInt32(this.hd_DownFileID.Value.Trim());
        string sUseUser = hd_Name.Value;//this.hd_Post.Value.Trim() + "/" + this.hd_Position.Value.Trim() + "/" + this.hd_Name.Value.Trim();
        try
        {
            using (File_Tx oFile = new File_Tx())
            {
                oFile.InsertFileHistory(ConfigurationManager.AppSettings.Get("ConnectionFile"), sFile_Id, sUseUser);
            }

            getFileList();
        }
        catch (Exception err)
        {
            throw err;
        }
    }


    protected void lbt_History_Click(object sender, EventArgs e)
    {
        InsertFileHistory();
    }
}


Layout Page(Excel Webpart) Height=550px Master Page

<%@ Page language="C#"   Inherits="Microsoft.SharePoint.Publishing.PublishingLayoutPage,Microsoft.SharePoint.Publishing,Version=12.0.0.0,Culture=neutral,PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Register Tagprefix="WebPartPages" Namespace="Microsoft.SharePoint.WebPartPages" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Register Tagprefix="OSRVWC" Namespace="Microsoft.Office.Server.WebControls" Assembly="Microsoft.Office.Server, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Register Tagprefix="SPSWC" Namespace="Microsoft.SharePoint.Portal.WebControls" Assembly="Microsoft.SharePoint.Portal, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Register Tagprefix="SEARCHWC" Namespace="Microsoft.Office.Server.Search.WebControls" Assembly="Microsoft.Office.Server.Search, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Register Tagprefix="PublishingWebControls" Namespace="Microsoft.SharePoint.Publishing.WebControls" Assembly="Microsoft.SharePoint.Publishing, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

<asp:Content ContentPlaceHolderID="PlaceHolderPageTitle" runat="server">
    <SharePoint:FieldValue id="PageTitle" FieldName="Title" runat="server" />
</asp:Content>

<asp:Content ContentPlaceHolderID="PlaceHolderPageTitleInTitleArea" runat="server">
</asp:Content>
<asp:Content ContentPlaceHolderId="PlaceHolderPageImage" runat="server"><IMG SRC="/_layouts/images/blank.gif" width=1 height=1 alt=""></asp:Content>
<asp:Content ContentPlaceHolderId="PlaceHolderTitleBreadcrumb" runat="server"/>
<asp:Content ContentPlaceHolderId="PlaceHolderAdditionalPageHead" runat="server">
<style>
TD.ms-titleareaframe, .ms-pagetitleareaframe {
 height: 10px;
}
Div.ms-titleareaframe {
 height: 100%;
}
.ms-pagetitleareaframe table {
 background: none;
 height: 10px;
}
</style>
</asp:Content>

<asp:Content ContentPlaceHolderId="PlaceHolderBodyAreaClass" runat="server">
<style type="text/css">
.ms-bodyareaframe {
 padding: 0px;
}
</style>
</asp:Content>

<asp:Content ContentPlaceHolderID="PlaceHolderMain" runat="server">
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js" type="text/javascript"></script> 
<script type="text/javascript"> 
function triggerMe(obj) {//trigger the bound event
    $(obj).trigger("ewaLoaded"); 
}
function ewaSetSize(obj) {//set proper width
    var e = $(obj).find("iframe:first").contents().find("table.ewrnav-invisibletable-nopadding:last"); 
    var w = e.width();
    var h = e.height();
    if (w == 0 || w == undefined) { //loop if content not ready 
        setTimeout("ewaSetSize('"+obj+"')",1000); 
    }else{ //set width in three places of wp 
        //w += 60; //add x-axis buffer space (configurable) 
        //h += 100; //add y-axis buffer 
        //$(obj).find("table:first> tbody:first> tr:eq(1)> td> div> div").width(w)
        //.find("table:first> tbody:first> tr:eq(1)> td> div").height(h);
        w = "100%";
        h = "100%";
        //$(obj).find("table:first> tbody:first> tr> td> div").width(w)
        $(obj).find("table:first> tbody:first> tr> td> div").height(h);
    } 
}
function bindMe(obj) { //bind event to the web part
    $(obj).bind("ewaLoaded", function(e) {
        var b = $(e.target).find("iframe:first").attr("postedbackalready");
        if (b == undefined) { //trigger this later
            setTimeout("triggerMe('" + obj + "')", 1000);
        } else { //try to set width now
            ewaSetSize(obj);
        }
    }).trigger("ewaLoaded");  //trigger when we bind 
}
$(function() { //find web parts with ewa content to load
    $("td[id^='MSOZoneCell_WebPart']").each(function(i, e) {
        var findIframe = $(e).find("iframe:first");
        if (findIframe && findIframe.attr("ScriptForIFrameContent")) {
            bindMe("#" + e.id); //bind an event we can trigger later 
        }
    });
}); 
</script>

<table width="100%" height="100%" style="padding-top:0px;" border="0" cellpadding="0" cellspacing="0" ID="OuterZoneTable">
 <tr ID="Top">
  <td ID="TopCell" width="100%" valign="top" style="padding-top: 0px;padding-left: 0px;padding-right: 0px;padding-bottom: 0px;">
   <WebPartPages:WebPartZone runat="server" AllowPersonalization="false" FrameType="TitleBarOnly" ID="TopZone"
                         Title="<%$Resources:sps,LayoutPageZone_TopZone%>" Orientation="Vertical"
                                QuickAdd-GroupNames="Default" QuickAdd-ShowListsAndLibraries="false" />
  </td>
 </tr>
</table>
</asp:Content>


Layout Page Master Page

<%@ Page language="C#"   Inherits="Microsoft.SharePoint.Publishing.PublishingLayoutPage,Microsoft.SharePoint.Publishing,Version=12.0.0.0,Culture=neutral,PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Register Tagprefix="WebPartPages" Namespace="Microsoft.SharePoint.WebPartPages" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Register Tagprefix="OSRVWC" Namespace="Microsoft.Office.Server.WebControls" Assembly="Microsoft.Office.Server, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Register Tagprefix="SPSWC" Namespace="Microsoft.SharePoint.Portal.WebControls" Assembly="Microsoft.SharePoint.Portal, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Register Tagprefix="SEARCHWC" Namespace="Microsoft.Office.Server.Search.WebControls" Assembly="Microsoft.Office.Server.Search, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Register Tagprefix="PublishingWebControls" Namespace="Microsoft.SharePoint.Publishing.WebControls" Assembly="Microsoft.SharePoint.Publishing, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

<asp:Content ContentPlaceHolderID="PlaceHolderPageTitle" runat="server">
    <SharePoint:FieldValue id="PageTitle" FieldName="Title" runat="server" />
</asp:Content>

<asp:Content ContentPlaceHolderID="PlaceHolderPageTitleInTitleArea" runat="server">
</asp:Content>
<asp:Content ContentPlaceHolderId="PlaceHolderPageImage" runat="server"><IMG SRC="/_layouts/images/blank.gif" width=1 height=1 alt=""></asp:Content>
<asp:Content ContentPlaceHolderId="PlaceHolderTitleBreadcrumb" runat="server"/>
<asp:Content ContentPlaceHolderId="PlaceHolderAdditionalPageHead" runat="server">
<style>
TD.ms-titleareaframe, .ms-pagetitleareaframe {
 height: 10px;
}
Div.ms-titleareaframe {
 height: 100%;
}
.ms-pagetitleareaframe table {
 background: none;
 height: 10px;
}
</style>
</asp:Content>

<asp:Content ContentPlaceHolderId="PlaceHolderBodyAreaClass" runat="server">
<style type="text/css">
.ms-bodyareaframe {
 padding: 0px;
}
</style>
</asp:Content>

<asp:Content ContentPlaceHolderID="PlaceHolderMain" runat="server">
<!-- Windh=100% Height=550으로 잡는 법 -->
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js" type="text/javascript"></script> 
<script type="text/javascript"> 
function triggerMe(obj) {//trigger the bound event
    $(obj).trigger("ewaLoaded"); 
}
function ewaSetSize(obj) {//set proper width
    var w = "100%";
    var h = 550;
    if (w == 0 || w == undefined) { //loop if content not ready 
        setTimeout("ewaSetSize('"+obj+"')",1000); 
    }else{ //set width in three places of wp 
        $(obj).find("table:first> tbody:first> tr> td> div").width(w)
        .find("table:first> tbody:first> tr> td> div").height(h);
    } 
}
function bindMe(obj) { //bind event to the web part
    $(obj).bind("ewaLoaded", function(e) {
        var b = $(e.target).find("iframe:first").attr("postedbackalready");
        if (b == undefined) { //trigger this later
            setTimeout("triggerMe('" + obj + "')", 1000);
        } else { //try to set width now
            ewaSetSize(obj);
        }
    }).trigger("ewaLoaded");  //trigger when we bind 
}
$(function() { //find web parts with ewa content to load
    $("td[id^='MSOZoneCell_WebPart']").each(function(i, e) {
        var findIframe = $(e).find("iframe:first");
        if (findIframe && findIframe.attr("ScriptForIFrameContent")) {
            bindMe("#" + e.id); //bind an event we can trigger later 
        }
    });
}); 
</script>

<table style="padding-top:0px;" border="0" cellpadding="0" cellspacing="0" ID="OuterZoneTable" width="100%">
 <tr ID="Top">
  <td ID="TopCell" colspan="2" width="100%" valign="top" style="padding-top: 0px;padding-left: 4px;padding-right: 4px;padding-bottom: 6px;">
   <WebPartPages:WebPartZone runat="server" AllowPersonalization="false" FrameType="TitleBarOnly" ID="TopZone"
                         Title="<%$Resources:sps,LayoutPageZone_TopZone%>" Orientation="Vertical"
                                QuickAdd-GroupNames="Default" QuickAdd-ShowListsAndLibraries="false" />
  </td>
 </tr>
 <tr ID="Middle">
  <td ID="MiddleLeftCell" width="50%" valign="top" style="padding-top: 0px;padding-left: 4px;padding-right: 3px;padding-bottom: 6px;">
   <WebPartPages:WebPartZone runat="server" AllowPersonalization="false" FrameType="TitleBarOnly" ID="MiddleLeftZone"
                         Title="<%$Resources:sps,LayoutPageZone_MiddleLeftZone%>" Orientation="Vertical"
                                QuickAdd-GroupNames="Default" QuickAdd-ShowListsAndLibraries="false" />
  </td>
  <td ID="MiddleRightCell" width="50%" valign="top" style="padding-top: 0px;padding-left: 3px;padding-right: 4px;padding-bottom: 6px;">
   <WebPartPages:WebPartZone runat="server" AllowPersonalization="false" FrameType="TitleBarOnly" ID="MiddleRightZone"
                         Title="<%$Resources:sps,LayoutPageZone_MiddleRightZone%>" Orientation="Vertical"
                                QuickAdd-GroupNames="Default" QuickAdd-ShowListsAndLibraries="false"/>
  </td>
 </tr>
 <tr ID="Bottom">
  <td ID="BottomCell" colspan="2" width="100%" valign="top" style="padding-top: 0px;padding-left: 4px;padding-right: 4px;padding-bottom: 0px;">
   <WebPartPages:WebPartZone runat="server" AllowPersonalization="false" FrameType="TitleBarOnly" ID="BottomZone"
                                Title="<%$Resources:sps,LayoutPageZone_BottomZone%>" Orientation="Vertical"
                                QuickAdd-GroupNames="Default" QuickAdd-ShowListsAndLibraries="false"/>
  </td>
 </tr>
</table>

</asp:Content>


Microsoft Korea Enterprise Office Server Team Blog 사이트링크


Custom Master Page Master Page

<%@Master language="C#"%>
<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Register Tagprefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Import Namespace="Microsoft.SharePoint" %>
<%@ Import Namespace="Microsoft.SharePoint.ApplicationPages" %>
<%@ Register Tagprefix="WebPartPages" Namespace="Microsoft.SharePoint.WebPartPages" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register TagPrefix="wssuc" TagName="Welcome" src="~/_controltemplates/Welcome.ascx" %>
<%@ Register TagPrefix="wssuc" TagName="DesignModeConsole" src="~/_controltemplates/DesignModeConsole.ascx" %>
<%@ Register Tagprefix="KSCC_QIS_MOSS" Namespace="KSCC_QIS_MOSS" Assembly="KSCC_QIS_MOSS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=27208e1ac21b95fe" %>
<HTML id="HTML1" dir="<%$Resources:wss,multipages_direction_dir_value%>" runat="server" xmlns:o="urn:schemas-microsoft-com:office:office">
<HEAD id="HEAD1" runat="server">
 <META Name="GENERATOR" Content="Microsoft SharePoint">
 <META Name="progid" Content="SharePoint.WebPartPage.Document">
 <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
 <META HTTP-EQUIV="Expires" content="0">
 <SharePoint:RobotsMetaTag ID="RobotsMetaTag1" runat="server"/>
 <Title ID=onetidTitle><asp:ContentPlaceHolder id=PlaceHolderPageTitle runat="server"/></Title>
 <SharePoint:CssLink ID="CssLink1" runat="server"/>
 <SharePoint:Theme ID="Theme1" runat="server"/>
 <SharePoint:ScriptLink ID="ScriptLink1" language="javascript" name="core.js" Defer="true" runat="server" />
 <SharePoint:CustomJSUrl ID="CustomJSUrl1" runat="server" />
 <SharePoint:SoapDiscoveryLink ID="SoapDiscoveryLink1" runat="server" />
 <asp:ContentPlaceHolder id="PlaceHolderAdditionalPageHead" runat="server"/>
 <SharePoint:DelegateControl ID="DelegateControl1" runat="server" ControlId="AdditionalPageHead" AllowMultipleControls="true"/>
</HEAD>
 
<body onload="javascript:_spBodyOnLoadWrapper();">
  <form id="Form1" runat="server" onsubmit="return _spFormOnSubmitWrapper();">
    <WebPartPages:SPWebPartManager id="m" runat="Server" />
<table width='100%' border='0' cellpadding='0' cellspacing='0'>
  <td valign="top">
    <table width='100%' border='0' cellpadding='0' cellspacing='0'>
      <TR>
        <KSCC_QIS_MOSS:TopNavigation ID="LeftNavigation" runat="server" />
         <td width="99%" valign="bottom" align="right" background="/_layouts/1042/IMAGES/KSCC_QIS_MOSS/topNavi_repeat_x.bmp" style="position:relative;bottom:0;left:0;background-repeat:repeat-x;">
           <table height=100% class="ms-siteaction" cellpadding=0 cellspacing=0>
            <tr>
               <td class="ms-siteactionsmenu" id="siteactiontd">
               <SharePoint:SiteActions runat="server" AccessKey="<%$Resources:wss,tb_SiteActions_AK%>" id="SiteActionsMenuMain"
             PrefixHtml="&lt;div&gt;&lt;div&gt;"
             SuffixHtml="&lt;/div&gt;&lt;/div&gt;"
             MenuNotVisibleHtml="&amp;nbsp;"
             >
             <CustomTemplate>
             <SharePoint:FeatureMenuTemplate ID="FeatureMenuTemplate1" runat="server"
              FeatureScope="Site"
              Location="Microsoft.SharePoint.StandardMenu"
              GroupId="SiteActions"
              UseShortId="true"
              >
              <SharePoint:MenuItemTemplate runat="server" id="MenuItem_Create"
               Text="<%$Resources:wss,viewlsts_pagetitle_create%>"
               Description="<%$Resources:wss,siteactions_createdescription%>"
               ImageUrl="/_layouts/images/Actionscreate.gif"
               MenuGroupId="100"
               Sequence="100"
               UseShortId="true"
               ClientOnClickNavigateUrl="~site/_layouts/create.aspx"
               PermissionsString="ManageLists, ManageSubwebs"
               PermissionMode="Any" />
              <SharePoint:MenuItemTemplate runat="server" id="MenuItem_EditPage"
               Text="<%$Resources:wss,siteactions_editpage%>"
               Description="<%$Resources:wss,siteactions_editpagedescription%>"
               ImageUrl="/_layouts/images/ActionsEditPage.gif"
               MenuGroupId="100"
               Sequence="200"
               ClientOnClickNavigateUrl="javascript:MSOLayout_ChangeLayoutMode(false);"
               />
              <SharePoint:MenuItemTemplate runat="server" id="MenuItem_Settings"
               Text="<%$Resources:wss,settings_pagetitle%>"
               Description="<%$Resources:wss,siteactions_sitesettingsdescription%>"
               ImageUrl="/_layouts/images/ActionsSettings.gif"
               MenuGroupId="100"
               Sequence="300"
               UseShortId="true"
               ClientOnClickNavigateUrl="~site/_layouts/settings.aspx"
               PermissionsString="EnumeratePermissions,ManageWeb,ManageSubwebs,AddAndCustomizePages,ApplyThemeAndBorder,ManageAlerts,ManageLists,ViewUsageData"
               PermissionMode="Any" />
             </SharePoint:FeatureMenuTemplate>
             </CustomTemplate>
            </SharePoint:SiteActions>
            </td>
            </tr>
           </table>
         </TD>
        </TR>
        <asp:ContentPlaceHolder ID="WSSDesignConsole" runat="server">
         <wssuc:DesignModeConsole id="IdDesignModeConsole" runat="server" />
        </asp:ContentPlaceHolder>
        <asp:ContentPlaceHolder ID="SPNavigation" runat="server">
        <SharePoint:DelegateControl ID="DelegateControl3" runat="server" ControlId="PublishingConsole"
           PrefixHtml="&lt;tr&gt;&lt;td colspan=&quot;4&quot; id=&quot;mpdmconsole&quot; class=&quot;ms-consolemptablerow&quot;&gt;"
           SuffixHtml="&lt;/td&gt;&lt;/tr&gt;"
           >
        </SharePoint:DelegateControl>
        </asp:ContentPlaceHolder>
      </table>
<!-- Top Navigation End ============================================================================-->
 </td></tr>
 <tr><td height='100%' valign="top">
      <table width="100%" height="100%" border="0" cellspacing="0" cellpadding="0">
      <tr><!-- Left Navi Start ms-nav-->
        <td width="200px" valign="top">
           <table width="100%" height="100%" border="0" cellpadding=0 cellspacing=0>
            <tr>
              <td width="10px"><IMG SRC="/_layouts/images/blank.gif" width="10px"/></td>
              <td valign="top">
               <table width="200px" height="100%" border="0" cellpadding="0" cellspacing="0">
             
                  <tr>
                    <td valign="top">
                      <table width="100%" border="0" cellspacing="0" cellpadding="0">
                        <tr>
                         <td>
                          <TABLE width="205px" height="100%" class=ms-navframe CELLPADDING=0 CELLSPACING=0 border="0">
                           <tr valign="top">
                            <!--<td width="4px"><IMG SRC="/_layouts/images/blank.gif" width=4 height=1 alt=""></td>-->
                            <td valign="top" width="100%">
                              <asp:ContentPlaceHolder id="PlaceHolderLeftNavBarDataSource" runat="server" />
                              <asp:ContentPlaceHolder id="PlaceHolderLeftNavBarTop" runat="server"/>
                                                       
                              <!-- ### Left WebPart Zone -->
            <asp:ContentPlaceHolder id="PlaceHolderLeftWebPartZone" runat="server" >
              <div class="ms-WPBody">
                <table><tr><td height="5"> </td></tr></table>

 

              </div>
             </asp:ContentPlaceHolder>
         
                              <asp:ContentPlaceHolder id="PlaceHolderLeftNavBar" runat="server">
                               <!-- ### SubPageLeftNavigation WebPart-->
                              </asp:ContentPlaceHolder>
                              <asp:ContentPlaceHolder id="PlaceHolderLeftActions" runat="server"></asp:ContentPlaceHolder>
                            </td>
                           </tr>
                           <tr><td colspan=2><asp:ContentPlaceHolder id="PlaceHolderNavSpacer" runat="server"><IMG SRC="/_layouts/images/blank.gif" width=138 height=1 alt=""></asp:ContentPlaceholder></td></tr>
                          </TABLE>
                         </td>
                         <td><asp:ContentPlaceHolder id="PlaceHolderLeftNavBarBorder" runat="server"></asp:ContentPlaceHolder></td>
                        </tr>
                      </table>
                     
                      </td>
                  </tr>
                </table></td>
            </tr>
          </table></td>
        <td width="15">&nbsp;</td>
        <td valign="top"><table width="100%" height="100%" border="0" cellspacing="0" cellpadding="0">
            <tr>
             <td >
              <table width="100%" height="100%" border="0" cellspacing="0" cellpadding="0">
                <tr>
                  <td valign=top id="onetidPageTitleAreaFrame" >
                  <table id="onetidPageTitleAreaTable" cellpadding="0" cellspacing="0" width="100%" border="0">
                   <tr>
                    <td valign="top" class="ms-titlearea"> <!-- 없으면 검색에서걸림 에서 site navi 존재함 -->
                     <asp:ContentPlaceHolder id="PlaceHolderTitleBreadcrumb" runat="server" Visible="false">
                     </asp:ContentPlaceHolder>
                    </td>
                   </tr>
                  </table>
                 </td>
                
                 <td class="ms-titlearearight">
                     <asp:ContentPlaceHolder id="PlaceHolderMiniConsole" runat="server"/>
                    <asp:ContentPlaceHolder id="PlaceHolderTitleRightMargin" runat="server">
                    </asp:ContentPlaceHolder>
                 </td>
                
                </tr>
                <tr>
                  <td class='ms-bodyareacell' valign="top">
                    <PlaceHolder id="MSO_ContentDiv" runat="server">
                    <table id="MSO_ContentTable" width=100% height="100%" border="0" cellspacing="0" cellpadding="0" class="ms-propertysheet">
                      <tr>
                         <td valign="top" height="100%">
                           <A name="mainContent"></A>
                         <asp:ContentPlaceHolder id="PlaceHolderPageDescription" runat="server"/>
                         <asp:ContentPlaceHolder id="PlaceHolderMain" runat="server"><!-- Body -->
                         </asp:ContentPlaceHolder>
                         </td>
                      </tr>
                    </table>
                    </PlaceHolder>
                  </td>
                  <td>
                  </td>
                </tr>
              </table>
          
             </td>
            </tr>
            <!-- Main Body End -->
          </table>
        </td>
        <td width="10">&nbsp;</td>
      </tr>
    </table>

    </td></tr>
 <tr><td height='100%' valign="bottom">

    <table width="100%" border="0" cellspacing="0" cellpadding="0">
      <tr>
        <td valign="top" width="100%">
        <!-- ### Bottom WebPart Zone -->
        <asp:ContentPlaceHolder id="PlaceHolderBottomWebPartZone" runat="server" />
        </td>
      </tr>
      <tr>
        <td height="40" align="center" bgcolor="#FFFFFF">
        <img src="/_layouts/enovatorcps/images/bottom.gif" width="420" height="20"/>
        </td>
      </tr>
    </table>
 
  <asp:ContentPlaceHolder id="PlaceHolderFormDigest" runat="server">
   <SharePoint:FormDigest ID="FormDigest1" runat=server/>
  </asp:ContentPlaceHolder>
   <input type="text" name="__spDummyText1" style="display:none;" size=1/>
   <input type="text" name="__spDummyText2" style="display:none;" size=1/>

  <asp:Panel ID="Panel1" visible="false" runat="server">
    <asp:ContentPlaceHolder id="PlaceHolderUtilityContent" runat="server"/>
    <asp:ContentPlaceHolder id="PlaceHolderBodyAreaClass" runat="server"/>
    <asp:ContentPlaceHolder id="PlaceHolderTitleAreaClass" runat="server"/>
    <asp:ContentPlaceHolder id="PlaceHolderBodyLeftBorder" runat="server"/>
    <asp:ContentPlaceHolder id="PlaceHolderBodyRightMargin" runat="server"/>
    <asp:ContentPlaceHolder ID="PlaceHolderTitleLeftBorder" runat="server"/>
    <asp:ContentPlaceHolder id="PlaceHolderPageTitleInTitleArea"  runat="server"/>
    <asp:ContentPlaceHolder ID="PlaceHolderTitleAreaSeparator" runat="server"/>
    <asp:ContentPlaceHolder id="PlaceHolderSearchArea" runat="server"/>
    <asp:ContentPlaceHolder ID="PlaceHolderPageImage" runat="server"/>
    <asp:ContentPlaceHolder id="PlaceHolderCalendarNavigator" runat ="server"/>
   
    <asp:ContentPlaceHolder id="PlaceHolderSiteName" runat="server" />
    <asp:ContentPlaceHolder id="PlaceHolderTopNavBar" runat="server" />
    <asp:ContentPlaceHolder id="PlaceHolderHorizontalNav" runat="server" />
  </asp:Panel>
</td></tr></table>
  </form>
</BODY>
</HTML>


1 2 3 4 5 6