Search Results for '프로그래밍'


1208 posts related to '프로그래밍'

  1. 2009/08/25 WMI를 이용한 MRTG
  2. 2009/08/25 FastCgi 에서 PHP 폴더의 실행 권한
  3. 2009/08/25 IIS 7.5 (Windows Server 2008 R2) 에서 FastCgi 성능 향상
  4. 2009/08/25 IIS 7, 모듈(Module) 관련 문서 모음
  5. 2009/08/25 SQL Server 2000 - 나만의 노하우 & Tip
  6. 2009/08/25 비정상적으로 분리된 .mdf 파일만 있는 데이터 베이스 복구
  7. 2009/08/25 Windows Web Server 2008 에서 SQL Server 2005 설치 제한 해제 패치(Hotfix)
  8. 2009/08/25 SQL Server Database File I/O Report
  9. 2009/08/25 저장프로시져(Stored Procedures) 및 함수(Functions)의 파라미터 조회
  10. 2009/08/25 Windows Server 2003에서 DNS 서버에 새 영역 만들기
  11. 2009/08/25 IIS 6 에서 ASP 에서 대용량 파일을 업로드시 403 오류 - KB327659
  12. 2009/08/25 https://<sitename> 사이트를 열 수 없습니다. SSL 인증서 오류 - KB239449
  13. 2009/08/25 IIS에서 CGI 응용 프로그램을 실행시 "액세스가 거부되었습니다." 메시지 - KB160422
  14. 2009/08/25 IIS FTP(파일 전송 프로토콜) 서비스에 대한 정보
  15. 2009/08/25 adsutil.vbs 를 이용한, IIS SMTP 서비스 메일 디렉토리 변경
  16. 2009/08/25 Sphinx - PHP 로 커스텀 검색 엔진 구현하기
  17. 2009/08/25 ASP 에서 Socket 통신 코드 예제 2
  18. 2009/08/25 IIS 7, URL Rewrite Module (URL 재작성 모듈)
  19. 2009/08/17 전화번호(국선/핸드폰) 붙여 있는거 중간에
  20. 2009/08/17 쿼리를 병렬로 수행하기위한 JOB
  21. 2009/08/17 내 컴퓨터에 있는 사진보기..[소스]
  22. 2009/08/17 Ajax + MySQL 5.0 버젼에서 한글처리하기 by Python
  23. 2009/08/17 Eclips 파일 종류별로 ascii로 저장할건지, binary로저장 할것인지 정의
  24. 2009/08/17 디버깅이 안되는 소스를 디버깅되게 하는법
  25. 2009/08/16 MSSQL SERVER에서 접속 port 변경하기
  26. 2009/08/16 IIS7 + FastCGI + PHP + MySQL 설치 방법
  27. 2009/08/11 Logparser를 이용한 IIS 로그 Forensic 방법
  28. 2009/08/11 MS SQL 스토어 프로시저 제거
  29. 2009/08/11 MS SQL 2005 xp_cmdshell 오픈하는 방법
  30. 2009/08/11 MS SQL 2000 vs 2005

다음은, Win32_PerfRawData_Tcpip_NetworkInterface 클래스를 이용해서 BytesReceivedPersec,BytesSentPersec  값을 WMI를 통해 가져오는 예제 코드 입니다.

set oSvc = GetObject("winmgmts:root\cimv2")

wqlQuery = "select BytesReceivedPersec,BytesSentPersec from Win32_PerfRawData_Tcpip_NetworkInterface where Name = 'Realtek RTL8139 Family PCI Fast Ethernet NIC'"

for each oData in oSvc.ExecQuery(wqlQuery)
 for each oProperty in oData.Properties_
  if oProperty.Name = "BytesReceivedPersec" then
   bytesReceived = oProperty.Value
  elseif oProperty.Name = "BytesSentPersec" then
   bytesSent = oProperty.Value
  end if
 next
next

wscript.echo bytesReceived
wscript.echo bytesSent

BytesReceivedPersec,BytesSentPersec 는 각 원시 Raw 값을 가져옵니다.

이 값은 uint 타입인데 vbscript 특성상 형선언에 의미가 없으므로  맨 마지막에서 순서대로 echo 를 통해서 출력만 해주면 됩니다.  중요한것은 무조건 맨처음과 그 다음 출력되는 글자만 값으로 되며, 필히 숫자이어야 하며, 2개를 반환해야 합니다.



출력된값은 MRTG에서 LIne 별로 값을 읽어 들입니다. 다음 부분은 MRTG의 cfg 일부입니다.

Target[serverinfo_wmi]: `cscript //nologo D:\wwwroot\mrtg-2.14.3\bin\traffic.vbs`
Options[serverinfo_wmi]: growright,bits

SNMP에서는 다음과 같은 형식입니다.

Target[serverinfo_snmp]: 65539:public@211.234.xxx.xxx:
Options[serverinfo_snmp]: growright,bits

2개의 차이점은, 거의 없어 보이죠?.
(Options에서 bits 를 넣어주면, 계산된 값에 * 8 을 해줘서 bit/sec 로 계산을 해준다. Byte 단위로 챠트를 출력할려면 bit를 넣어주지 않으면 된다.)


지금까지 예제를 보면, 아주 쉽습니다. 그냥 vbscript를 통해서 2개의 값만 리턴을 해주는 명령어를 넣어주기만 하면 되니깐.. 관리도구에 있는 성능카운터에 있는 모든 클래스를 소스로 이용할수 있습니다. 그외 별도의 응용프로그램에서 리턴해주는 모든값도 가능합니다.

다만, MRTG가 perl 기반이라는 단점외에는...
2009/08/25 14:26 2009/08/25 14:26
FastCgi 에서, PHP 는 매우 가볍고 빠르게 동작 합니다.
물론 세팅 방법도 기존과 다르게 보다 쉽습니다.

FastCgi 에서 PHP 는,. IIS 6에서는 작업자 프로세스에 의해서 실행이 됩니다. 그래서 PHP 가 설치되어 있는 폴더(php-cgi.exe 가 위치하는 폴더) 에는 Network Service 계정 접근이 가능 해야 합니다.

보통 읽기(Read) 권한만 설정되어 있어도 PHP 스크립트는 매우 잘 작동 합니다. 그러나, PHP 코딩 방식중에 Include 등의 함수 호출에서 코드 방식에 따라서 오류(FastCgi 에서 Http 500)가 발생 합니다.

include 또는 require_once 에서 상대 경로를 호출할 경우인데요. 요즘 대부분의 include 에서 페이지 호출 방식은 상대경로(relative path)를 이용하고 있습니다.

물론,. $_SERVER["DOCUMENT_ROOT"] 처럼 절대 경로를 반환해 주는 환경 변수를 이용해서 include 하는 경우에는 문제가 없으나, "../" 와 같은 상대 경로를 이용할때에는 오류가 발생 합니다.

[error] PHP Warning:
failed to open stream:
No such file or directory in
/main.php on line 15

이러한 오류는, PHP Cgi 에서 실행(Read & Execute) 권한(permission)이 없기 때문 입니다.

개체 이름: D:\php5\php-cgi.exe
이미지 파일 이름: C:\WINDOWS\system32\inetsrv\w3wp.exe
기본 사용자 이름: NETWORK SERVICE
액세스: SYNCHRONIZE
  ReadData (또는 ListDirectory)
  실행/트래버스
  ReadAttributes



위와 같이 작업자 프로세스 실행 계정에, 실행권한을 설정을 해줄 경우 기존 Linux 에서 작동하는 PHP 스크립트 대부분은 문제 없이 잘 작동 합니다.

물론, 세션 저장 폴더나 로깅 폴더등에는 추가적으로 쓰기/삭제 권한까지 필요 합니다.

출처 : http://www.wssplex.net/TipnTech.aspx?Seq=508
2009/08/25 14:24 2009/08/25 14:24
현재의 Windows Server 2008 다음으로 출시될 예정인 Windows Server 2008 R2 (Windows 7) 의 IIS 7.5 에서는 FastCgi 의 성능이 향상된다고 합니다.

http://blogs.iis.net/ksingla/archive/2009/01/22/improvements-to-fastcgi-in-iis-7-5.aspx

1. FastCgi 가 작동하는 응용프로그램 풀(프로세스) 에서 지정된 특정 파일 모니터링
   --> 기존 web.config 수정 모니터링 처럼 FastCgi 에서도 가능하게 한것 같은데요. 그것 보다는 단순한 듯.

2. 실시간 튜닝 자동화
  --> Windows 7 (Windows Server 2008 R2) 에서 maxInstances 등의 값을 0 으로 하는 경우에는 FastCgi 모듈이 요청 상태에 알맞게 FastCgi 인스턴스를 자동으로 조정

3. 추적
 --> 대부분의 Cgi 는 자체 메시지 출력(Stdout)을 하는데, 에러시 기존에는 각자의 로깅방법등을 이용했는데 IIS 7.5 에서는 그것을 IIS Trace 에서 받을수 있음.

4. STDERR stream 핸들링
 --> Stdout(StdErr) 의 값에 따라서 특정한 값에 해당하는 경우 지정된 서버 상태코드로 설정이 가능

2009/08/25 14:24 2009/08/25 14:24
본 웹사이트에 소개된 IIS 7 모듈에 관련된 포스트 모음 입니다.

Web Analytics Tracking Module
http://www.wssplex.net/Tools/UsefulTools.aspx?Seq=92

Image Gallery Directory Listing Module
http://www.wssplex.net/Tools/UsefulTools.aspx?Seq=91

URL Rewrite Module
http://www.wssplex.net/Tools/UsefulTools.aspx?Seq=87

Application Request Routing Modulehttp://www.wssplex.net/Tools/UsefulTools.aspx?Seq=79

Backup & Restore Module
http://www.wssplex.net/Tools/UsefulTools.aspx?Seq=74

미디어 팩(Media Pack) Bit Rate Throttling Module
http://www.wssplex.net/Tools/UsefulTools.aspx?Seq=69

Request Filtering Module
http://www.wssplex.net/TipnTech.aspx?Seq=396

이외에도, 수많은 모듈이 있으며 프로그래밍이 가능하다면 모듈 작성 및 추가는 그리 어렵지 않게 추가가 가능한 IIS 7 입니다.
2009/08/25 14:23 2009/08/25 14:23
다음 문서는, SQL Server 2000 관련해서 공개 팁중 각 분류별 유용한 팁을 정리해 놓은 PDF 파입니다.

배포는 Microsoft 에서 하고 있으며, 2005년 한국데이터베이스진흥센터 주최 SQL Server 나만의 노하우 공개 페티스벌 이벤트를 통해서 수집되어진 자료를 기반으로 한국데이터베이스 진흥센터 승인하에 제작된 문서라고 합니다.

문서발행이 2006년 11월인데요,. 현재 SQL Server 2005 버젼이므로 이미 관련 팁은 수 많은 웹사이트에 공개가 많이 되어 있을것입니다.


다운로드:

http://download.microsoft.com/download/6/8/f/68f15f44-e957-4a1a-
97b8-b7444e4d0379/MyKnowhow,Tips_SQL_Server_2000.pdf



세미나 같은게 참석하시면 가끔식 MS에서 나눠주기도 합니다.^^
2009/08/25 14:23 2009/08/25 14:23
대부분의 경우,. 자체의 기존 경로의 DB 이었거나 detach 등의 데이터 베이스중 로그파일이 손상되어 mdf 파일만 있는 경우에는 거의 대부분 sp_attach_single_file_db 프로시져나 EM 의 데이터베이스 연결을 통해서 복구가 가능합니다.

- SQL Server 2005 이후에는 데이터베이스 연결 프로시져인 sp_attach_single_file_db 대신에 CREATE DATABASE database_name FOR ATTACH 를 사용하는 것이 좋습니다 -




그러나,. 단일 mdf 파일만 가지고선 복구가 안되는 경우가 다른 서버나 경로에서 정상적인 분리없이 가져와진 단일 mdf 파일만 있는 경우 입니다. 정상적인 분리이었거나 원래 서버 및 경로인 경우에는 위와 같은 ldf 가 없더라도 정상적으로 로그파일이 생성이 됩니다.



그러나 비정상적인 경우에는 다음과 같은 메시지가 나오면서 작업진행이 더 이상안 되지요.. 물론 쿼리문으로 실행하는 것도 같습니다. 어차피 EM 으로 작동되는게 모두 쿼리문의 SQL Server 엔진에 전달이 되니깐요..


이런 경우 해당 데이터베이스 명의 로그파일을 바꿔치기 하는 방법으로 복구 가능합니다. 이러한 복구 방법은 이미 주의대상(Suspect) 모드에서의 복구 절차와 거의 같습니다.


1. 먼저 wssplex 와 동일한 이름의 데이터베이스를 만듭니다.
2. 그다음에,. SQL Server 를 종료한 다음에 원본wssplex 와 바꿔치기를 합니다.
3. SQL Server 서비스를 재시작 하면, 새로 생성된 ldf는 원본wssplex 의 원래 로그과 다르므로 아래와 같은 주의 대상 상태로 변경 됩니다.





4. 이때, 다음과 같은 쿼리문을 실행하여 wssplex 상태를 변경 시킵니다.

sp_configure 'allow updates',1
go
reconfigure with override
go
update sysdatabases set
status=-32768 where dbid=DB_ID('wssplex')
go
sp_configure 'allow updates',0
go
reconfigure with override
go

32768 은 데이터베이스 응급 모드로 상태를 변경하겠다는 것입니다.


5. 그다음으로, SQL Server 서비스를 종료 합니다. 그리고 현재 상태에서의 문제가 되는 로그파일을 삭제후 SQL Server 서비스를 재시작 하면 다음과 같이 응급 모드로 변경이 됩니다.




6. 이제 wssplex 데이터 베이스는 ldf 가 없는 읽기 가능한 상태로, 레코드 조회나 DTS 를 통해서 데이터 끌어갈수도 있게 되었으나 역시 읽기전용 모드 입니다.


7
. 현재 상태는 로그파일이 정상적이지 않은 상태이므로, 로그파일을 재생성을 해주면 되며, 다음과 같은 쿼리를 실행하고 완료후 wsspelx 는 이제 정상적인 데이터베이스가 되었습니다.

dbcc rebuild_log('wssplex','d:\wssplex_log.ldf')


경고: 'wssplex' 데이터베이스에 대한 로그가 다시 작성되었습니다.
트랜잭션에 일관성이 없습니다. 물리적 일관성을 검사하려면 DBCC CHECKDB를 실행해야 합니다.
데이터베이스 옵션을 원래대로 설정하고 다른 로그 파일을 삭제해야 합니다.
DBCC 실행이 완료되었습니다. DBCC에서 오류 메시지를 출력하면 시스템 관리자에게 문의하십시오.





물론 현재 다음과 같이 엑세스 제한 상태입니다.



이제 위 제한값만 체크 해제를 해주면 곧바로 사용할수 있겠네요..^^




최초 시도했던 attach 경로 및 데이터베이스 DB 및 로그파일이 생성이 완료 되었고 정상적으로 데이터베이스 이용이 가능해 졌습니다.!!

출처 : http://www.wssplex.net/TipnTech.aspx?Seq=470
2009/08/25 14:21 2009/08/25 14:21
www.wssplex.net


Windows Web Server 2003 에서는,. 소프트웨어 설치에 제한 사항이 많았으나?? Windows Web Server 2008 에서는 하드웨어 스펙 제한과,. OS 자체의 구성요소 제한 외에는 거의 없습니다.

DB서버를 운영하기 위해서,. 저사양? 스펙에서는 Standard 버젼을 굳이 쓸 이유가 없겠지요. 이럴때 Windows Web Server 2008 이 좋은 대안인데,.. SMB 시장에서는 웹서버와 DB 서버를 같이 운영할수 있기에 좋을것 같습니다.

그런데,. Windows Web Server 2008 에, SQL Server 2005 를 설치하는 경우 다음과 같은 설치 제한이 있습니다. 기본 인스톨 본으로는 아래와 같이 워크스테이션 구성요소, 온라인 설명서 및 개발 도구 밖엔 설치를 할수 없습니다.



이러한 설치 제한에 대한,. 패치(Hotfix)가 배포되고 있습니다.

x32, x64 각각 배포가 되고 있는데요.... 패치를 설치하고 나면,. 아래와 같이 설치 제한이 없어져 정상적인 설치 진행이 가능해 집니다.

http://support.microsoft.com/kb/950636

SQL Server 2005 Installer Hotfix for Windows Web Server 2008 (x86)
SQL Server 2005 Installer Hotfix for Windows Web Server 2008 (x64)



많은 고객들이 Web Server 버젼에 SQL Server 설치를 원했기 때문에 이와 같은 패치를 내놓았다고 합니다....

그리고,. 애초에 SQL Server 설치를 Web Server 버젼에 설치하는 것을 계획하지 않았기 때문에 SQL Server 2005 installer 가 Windows Web Server 2008 라이선싱 정보를 예상하지 못했다고 합니다.
출처 : http://www.wssplex.net/TipnTech.aspx?Seq=477
2009/08/25 14:21 2009/08/25 14:21
www.wssplex.net
http://www.databasejournal.com/features/mssql/article.php/3796551/article.htm 를 보면,. 각 DB 별 I/O 사용량 통계 쿼리 예제 입니다. 물론,. 제공되는 시스템뷰나 함수를 좀더 보기쉽고 직관적으로 알수 있도록 만들어 놓은 쿼리 입니다.

SQL Server 2005 및 SQL Server 2008
select db_name(mf.database_id) as database_name, mf.physical_name,
left(mf.physical_name, 1) as drive_letter,
vfs.num_of_writes, vfs.num_of_bytes_written, vfs.io_stall_write_ms,
mf.type_desc, vfs.num_of_reads, vfs.num_of_bytes_read, vfs.io_stall_read_ms,
vfs.io_stall, vfs.size_on_disk_bytes
from sys.master_files mf
join sys.dm_io_virtual_file_stats(NULL, NULL) vfs
on mf.database_id=vfs.database_id and mf.file_id=vfs.file_id
order by vfs.num_of_bytes_written desc

SQL Server 2000 에서는 2005 나 2008 처럼 다양한 시스템뷰 나 함수를 지원하지 않기 때문에 다음처럼 커서를 이용해서 임시테이블에 넣는 방법을 이용합니다.

SQL Server 2000
DECLARE @DBID smallint
DECLARE @FILEID smallint
DECLARE @DBNAME sysname
DECLARE @FILENAME nvarchar(260)
 
CREATE TABLE #FileIOStats
(name sysname,
filename nvarchar(260),
drive_letter char(1),
NumberReads bigint,
NumberWrites bigint,
BytesRead bigint,
BytesWritten bigint,
IoStallMS bigint)
 
DECLARE ALLFILES CURSOR FOR
SELECT dbid, fileid, [name], [filename] FROM [master].[dbo].[sysaltfiles]
 
OPEN ALLFILES
FETCH NEXT FROM ALLFILES INTO @DBID, @FILEID, @DBNAME, @FILENAME
 
WHILE (@@FETCH_STATUS = 0)
BEGIN
 
                INSERT INTO #FileIOStats
                SELECT @DBNAME, @FILENAME, left(@FILENAME, 1), NumberReads, NumberWrites, BytesRead, BytesWritten, IoStallMS
                FROM ::fn_virtualfilestats(@DBID, @FILEID)
 
                FETCH NEXT FROM ALLFILES INTO @DBID, @FILEID, @DBNAME, @FILENAME
END
 
CLOSE ALLFILES
DEALLOCATE ALLFILES
 
SELECT * FROM #FileIOStats
DROP TABLE #FileIOStats

좀더 자세한 사항은 위 포스트를 참고해 보시기 바랍니다.
2009/08/25 14:20 2009/08/25 14:20
www.wssplex.net
http://www.mssqltips.com/tip.asp?tip=1669 는 해당 데이터베이스에 있는 저장프로시져 및 함수에서 사용되는 파라미터의 각 목록을 확인할수 있는 쿼리 스크립트 입니다.

SELECT SCHEMA_NAME(SCHEMA_ID) AS [Schema],
SO.name AS [ObjectName],
SO.Type_Desc AS [ObjectType (UDF/SP)],
P.parameter_id AS [ParameterID],
P.name AS [ParameterName],
TYPE_NAME(P.user_type_id) AS [ParameterDataType],
P.max_length AS [ParameterMaxBytes],
P.is_output AS [IsOutPutParameter]
FROM sys.objects AS SO
INNER JOIN sys.parameters AS P
ON SO.OBJECT_ID = P.OBJECT_ID
WHERE SO.OBJECT_ID IN ( SELECT OBJECT_ID
FROM sys.objects
WHERE TYPE IN ('P','FN'))
ORDER BY [Schema], SO.name, P.parameter_id

이를테면,. 특정 파라미터에 정의된 값을 찾아서 수정이 필요한 경우에 이용해 볼수 있을것 같고 그외 목적에 따라서 위 쿼리 스크립트를 약간만 수정해도 다양하게 이용할수 있을것 같습니다.

위 쿼리스크립트에 대한 자세한 내용은 해당 원문 페이지를 확인해 보시기 바라며, SQL Server 2005 이상에서만 지원 가능한 시스템뷰를 이용하므로 SQL Server 2000 에서는 작동하지 않습니다.
2009/08/25 14:20 2009/08/25 14:20
다음 문서는 kb 중 DNS 에 새 도메인 추가방법 및 순서에 대해서 설명해 놓은 것입니다.

물론 이런 내용은 이미 온라인 도움말에 있는 내용 그대로 입니다만,. 설정 작업에 앞서 DNS 에 대한 기본 개념을 사전에 이해하는 것이 훨씬더 쉬운 작업이 될수 있습니다.^^

http://support.microsoft.com/kb/323445/ko


정방향 조회 영역을 만드는 방법

정방향 조회 영역 속성을 수정하는 방법

역방향 조회 영역을 만드는 방법

역방향 조회 영역 속성을 수정하는 방법

호스트 레코드를 만드는 방법

CNAME을 추가하는 방법

MX 레코드를 추가하는 방법

이름 서버를 추가하는 방법


2009/08/25 14:19 2009/08/25 14:19

ASP(Active Server Pages) 요청을 사용하여 Microsoft 인터넷 정보 서비스(IIS) 5.0, Microsoft 인터넷 정보 서비스(IIS) 5.1 또는 Microsoft 인터넷 정보 서비스(IIS) 6.0이 설치된 컴퓨터에 큰 파일을 업로드하면 업로드가 실패할 수 있습니다. 또한 403 오류 응답이나 다음 중 하나와 유사한 오류 메시지가 나타날 수 있습니다.


오류 메시지 1
Request object error 'ASP 0104 : 80004005' 허용되지 않는 작업 :

오류 메시지 2

007~ASP 0104~허용되지 않는 작업

많은 폼 데이터를 ASP 페이지에 게시할 때 다음과 유사한 오류 메시지가 나타날 수 있습니다.

오류 ’80020009’ 예외가 발생했습니다.

또한 Response.binaryWrite 메서드를 사용할 때 파일 업로드가 실패할 수 있습니다.


이 문제는 Content-Length 헤더가 있고 Content-Length 헤더에서 IIS 메타베이스의 AspMaxRequestEntityAllowed 속성 값보다 큰 데이터 양을 지정하는 경우 발생합니다. AspMaxRequestEntityAllowed 속성의 기본값은 204,800바이트입니다.


해결 방법

cscript adsutil.vbs set w3svc/ASPMaxRequestEntityAllowed size

(*이 명령에서 size는 허용할 최대 파일 크기 업로드의 자리 표시자입니다. 최대값은 1,073,741,824바이트입니다. 이 값을 원하는 기능에 허용되는 최소값으로 설정하십시오.)

--> 업로드 컴포넌트의 성능에 따라서, 대용량 파일을 업로드 하면 웹서버측 메모리 과다 점유로 인해서 성능저하가 발생할 수 있으니 조심 스럽게 설정하는게 좋습니다.^^

이와 관련된 메타베이스 값으로 AspBufferingLimit 있습니다. 이 부분은 다운로드 버퍼링에 관련된 것으로 파일 링크를 막기 위해서 Asp 코드에 파일 쓰기후 다운로드 처리를 하는 경우가 많은데요,. 이때 대용량 파일 다운로드시에 지정된 크기 이상일 경우 오류가 발생하게 됩니다.

AspBufferingLimit : http://msdn.microsoft.com/library/default.asp?url=/library/
en-us/iissdk/html/ecfc3d4a-0178-45e8-89f8-304429b7fda5.asp



AspMaxRequestEntityAllowed 속성은 ASP 요청의 엔터티 본문에서 허용되는 최대 바이트 수를 지정합니다. Content-Length 헤더가 있고 Content-Length 헤더에서 AspMaxRequestEntityAllowed 속성 값보다 큰 데이터 양을 지정하는 경우 IIS에서 403 오류 응답을 반환합니다. AspMaxRequestEntityAllowed 속성은 PUT 요청과 POST 요청에만 적용되고, GET 요청에는 적용되지 않습니다. 이 메타베이스 속성이 ASP에만 적용되기 때문에 다른 ISAPI(인터넷 서버 API) 확장은 영향을 받지 않습니다.

AspMaxRequestEntityAllowed 속성은 MaxRequestEntityAllowed 속성의 기능과 관련되어 있습니다. 그러나 AspMaxRequestEntityAllowed 속성은 ASP 요청에만 적용됩니다. MaxRequestEntityAllowed 속성을 WWW 서비스(World Wide Web 게시 서비스) 수준에서 1MB로 설정할 수 있습니다. 그런 다음 특정 ASP 응용 프로그램에서 더 작은 양의 데이터를 처리하는 것을 알고 있는 경우 AspMaxRequestEntityAllowed 속성을 더 작은 값으로 설정할 수 있습니다.

--> ASP.NET 에서는 machine.config  또는 전역 web.config 및 각 웹사이트의 web.config 에서 지정할 수 있습니다.^^
2009/08/25 14:19 2009/08/25 14:19

현상

SGC(Server Gated Cryptography) 인증서를 사용하면 HTTPS 프로토콜을 사용하여 사이트에 액세스하려는 클라이언트에 다음과 같은 오류 메시지가 나타날 수 있습니다.

IIS 4.0:

https://<sitename> 사이트를 열 수 없습니다.
제공된 인증서가 잘못되었습니다.

IIS 5.0:

페이지를 표시할 수 없습니다.
서버를 찾을 수 없거나 DNS 오류입니다.


--> SGC 인증서 때문인데요. SGC 인증서는 현재는 발급되는 경우가 거의 없습니다. 물론 대부분의 웹서버 SSL 인증서 판매 업체에서는 판매를 하고 있습니다.

SGC(Server Gated Cryptography) 는 클라이언트 브라우져가 40비트/50비트만 지원하고, 128 비트를 지원하지 못하는 경우에도 인증서 자체가 강제적으로 128 비트/ 256 비트 암호화가 가능하도록 지원하는 인증서 규격 입니다. ^^

최근 거의 대부분의 웹서버 및 웹브라우져가 128비트 / 256비트 인증서를 지원하며, IE 7 에서는 SSL 3.0 만 지원하도록 변경되었습니다. 암호화 강도는 점차 높아질 것입니다. ^^

웹서버 인증서 :  http://www.comodossl.co.kr/

2009/08/25 14:18 2009/08/25 14:18

다음 문서는 IIS 6 에 해당되는 내용으로, CGI/ISAPI 실행시 나타날 수 있는 사항입니다.


현상

IIS에서 CGI 응용 프로그램을 실행하려고 하면 다음과 같은 메시지가 나타납니다.

      액세스가 거부되었습니다.


원인

이 문제는 익명 계정에 CGI에 대한 권한이 없는 경우 발생합니다. CGI 응용 프로그램을 시작하려고 하면 IIS에서는 익명 사용자를 사용합니다. 익명 계정에 해당 파일에 대한 권한이 없기 때문에 프로세스 실행이 실패하고 STDOUT을 통해 오류 메시지가 반환됩니다.

그러나 IIS에서는 프로세스가 정상적으로 실행되고 종료된 것으로 인식합니다. 액세스 거부 오류 메시지가 STDOUT에 있기 때문에 IIS에서는 프로세스 실패를 인식할 방법이 없습니다.

익명 계정이 프로세스를 시작할 수 있었기 때문에 다른 인증 방법을 시도하지 않습니다. IIS에서는 CreateProcessAsUser API 호출을 사용하여 CGI 응용 프로그램을 시작합니다. 사용자에게 CGI/ISAPI 응용 프로그램에 대한 NTFS 권한이 없는 경우 CreateProcessAsUser는 정상적으로 종료됩니다.


해결

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ W3SVC\Parameters

W3SVC/Parameters 아래에 CreateProcessAsUser 값을 REG_DWORD로 추가하고 값을 0으로 지정합니다. 이렇게 하면 CGI가 CreateProcess API를 통해 시스템 컨텍스트에서 실행됩니다.

이 경우 CGI 스크립트의 시스템 액세스 권한이 보통 때보다 훨씬 커지기 때문에 심각한 보안 문제를 일으킬 수 있습니다.


--> 위 적용에 대해서, 절대 추천하지 않습니다. 왜나면, 일반적으로 웹사이트 실행은 최소 권한인 IUSER 계정으로 접근을 하는데 위와 같이 값을 변경하게 되면 SYSTEM 권한으로 실행이 되므로 익명의 사용자가 서버 전체에 접근할수 있는 권한을 가지게 되는 것이죠..

이와 비슷한 예로, Windows 2000 서버에서 ASP.NET 실행시 잘 안되는 경우가 있다는 질문이 여러 게시판에 올라오는데요. 그 답변이 대부분 machine.config 에서 실행계정은 "system" 으로 변경하라고 제시를 해줍니다. 이 또한 위와 같이 system 권한으로 ASP.NET 웹사이트를 실행하므로 매우 위험한 답변을 제시해 주고 있는 것입니다.

웹개발자는, 서버보안에 상관없이 당장 제작된 웹프로그램 실행이 중요하기 때문에 이런 사항에 대해서는 서버운영자가 필히 적절한 조치 및 방향을 제시해 주어야 하는게 좋겠죠.^^
2009/08/25 14:18 2009/08/25 14:18
IIS FTP(파일 전송 프로토콜) 서비스에 대한 Knowledge Base 문서로, Active 모드 FTP 와 Passive 모드 FTP 에 대한 설명 및 각 모드에서의 FTP 명령 전송 과정을 설명해 놓았습니다.

IIS FTP(파일 전송 프로토콜) 서비스에 대한 정보:
http://support.microsoft.com/default.aspx/kb/283679/ko


참고문서

http://pintday.org/whitepapers/ftp-review.shtml 를 보면, Active 모드, Passive 모드의 차이점을 서버와 클라이언트간 연결 그림을 통해서 쉽게 이해할수 있을것 같습니다.

IIS FTP에 패시브모드 포트 범위 설정:
http://www.serverinfo.pe.kr/TipnTech.aspx?Seq=212

2009/08/25 14:17 2009/08/25 14:17
XIMS: Relocating the Directories Used by SMTP Service
http://support.microsoft.com/kb/240917

adsutil.vbs set smtpsvc/1/dropdirectory  dir
adsutil.vbs set smtpsvc/1badmaildirectory  dir
adsutil.vbs set pickupdirectory dir
adsutil.vbs set queuedirectory dir

위에것 그대로 가져다가 안된다고 하는 사람들 많았을듯;;;
2006년에 검토를 했다는데 아직도 수정이 안됨. 검토를 한거는 한건지.... -_-;;;

위 내용중에,. 예제 명령행에 오타가 있음;;;;
다음 처럼....

adsutil.vbs set smtpsvc/1/dropdirectory "d:\mailroot\drop"
adsutil.vbs set smtpsvc/1/badmaildirectory "d:\mailroot\badmail"
adsutil.vbs set smtpsvc/1/pickupdirectory "d:\mailroot\pickup"
adsutil.vbs set smtpsvc/1/queuedirectory "d:\mailroot\queue"

2009/08/25 14:16 2009/08/25 14:16
Sphinx를 사용하여 콘텐트를 색인하고, 텍스트를 빠르게 찾으며, 유용한 검색 결과 만들기


http://www.sphinxsearch.com/


무료의 오픈 소스 검색 엔진으로서 텍스트를 매우 빠르게 검색하도록 설계되었다.

예를 들어, 다섯 개의 인덱스 컬럼과 약 30만 개의 행을 가진 활성 데이터베이스에서, 각 컬럼은 15 단어를 포함하고 있다면, Sphinx는 "any of these words" 검색 결과를 100분의 1초 안에 찾아낸다.
(2-GHz AMD Opteron 프로세서, 1 GB RAM, Debian Linux® Sarge).

C++로 작성되어 있고, Windows 기반도 지원 한다고 합니다.
요즘 검색엔진 프로젝트가 꾀 많군요..

자세한 내용은 다음 링크의 문서를 참고 해보세요..^^;;

http://www.ibm.com/developerworks/kr/library/
os-php-sphinxsearch/index.html

2009/08/25 14:14 2009/08/25 14:14
Asp 에서는 Socket 통신을 할려면 별도의 구성요소(컴포넌트)가 필요 합니다.

여타 웹 스크립트 언어 자체에서 모든 기능을 제공하는 대신 Asp 는 Server.CreateObject 라는 구조를 통해서 무한한 가능성을 열어주는 대신에,.. 직접 만들어야 하다는 단점.,.. 각설하고...

http://tech.dimac.net/ 에서,. Socket 통신이 가능한 간단한 컴포넌트를 배포하고 있습니다. 다운로드 할려면 이메일 쓰고 등록해야 하더군요. 뭐 간단하지만,.. 그래서 SkyDrive 에..



물론 소스코드는 Microsoft 에서 배포하는 것을 참조하였으므로,. readme.txt 에서도 ftp://ftp.microsoft.com/bussys/winsock/winsock2/ 에서도 가능하겠고요. ^^

- 닷넷이라면,.. System.Net 네임스페이스 에서 가능 -

예제 입니다. 간단 합니다.
아래 예제는 후이즈 서버에서 도메인 정보를 받아오는 것입니다.

<%

Set Socket = Server.CreateObject("Socket.TCP")

Socket.host = "whois.internic.net:43"
Socket.timeout = 2000
Socket.Open()
Socket.sendLine( "wssplex.net"&VbCrLf )
Socket.WaitForDisconnect()

Response.write Socket.buffer

Socket.close()
Set Socket = Nothing

%>

소켓을 통해서 보내지는 데이터는 해당 프로토콜 형식에 맞게 전달되어야 겠고, 받아온 데이터 역시 해당 소켓 서버에서 평문이 아닌 특정 형식이라면 추가적인 데이터 조작이 필요할 것이고요...^^

사용은,. 해당 dll 을 regsvr32 를 통해서 레지스트리 클래스 항목에 등록을 하고,. 혹시 웹에서 객체 생성시 권한 오류가 발생 한다면 웹사이트 익명 계정에 적절한 권한을 설정해 주면 됩니다.


해당 컴포넌트를 들여다 보면,. 구현된 Public 메소드와 속성은 위와 같습니다.

출처 : http://www.wssplex.net/TipnTech.aspx?Seq=486
2009/08/25 14:07 2009/08/25 14:07
URL Rewrite 모듈은,. 이미 인터넷 상에 매우 많은 종류가 배포되어 사용되고 있습니다. IIS 7 에서는 모듈형태로 URL Rewrite Module 이 제공이 되고 있는데요,. 별도로 다운로드 해서 설치를 해줘야 합니다.



Request Filtering 과 URL Rewrite Module 는, Http 요청이 오면 BeginRequest 이벤트에 의해서 작동이 됩니다.


다운로드:
x86: http://www.iis.net/downloads/default.aspx?tabid=34&g=6&i=1691
x64: http://www.iis.net/downloads/default.aspx?tabid=34&g=6&i=1692



IIS7 의 URL Rewrite Module 은 쉽게 URL Rewrite Rule 설정이 가능하도록 UI 를 제공하고 있습니다.

Blank rule 은 직접 모든 항목을 설정하는 것이며,

User friendly URL 은 웹브라우져의 주소창의 URL 을 토대로 몇개의 재작성된 URL 주소 형식 기준의 패턴을 보여 줍니다.

Rule with rewrite map 은 일종의 고정된 템플릿 패턴을 저장후 룰 설정이 호출해서 이용할수 있으며,

Request blocking 은 특정 패턴의 요청을 401, 403, 404, Abort Request 으로 응답을 해줍니다. 일종의 방화벽 역할과 비슷하죠..^^

물론, 기능중에는 Apache 의 mod_rewrite 룰도 가져와서 적용할수 있습니다.




설정된 정보중 전역설정값은 applicationhost.config 에 저장되며, 사이트 단위 설정은 web.config 에 저장됩니다.

<rewrite>
    <globalRules>
 <rule name="Rewrite rule1 for StaticTest">
     <match url=".*" />
     <conditions>
  <add input="{StaticTest:{REQUEST_URI}}" pattern="(.+)" />
     </conditions>
     <action type="Rewrite" url="{C:1}" appendQueryString="false" />
 </rule>
    </globalRules>
    <rewriteMaps>
 <rewriteMap name="StaticTest">
     <add key="/article1" value="/article.aspx?id=1&amp;title=some-tile" />
 </rewriteMap>
    </rewriteMaps>
</rewrite>


위처럼 직접 config 을 수정해서 적용이 가능하지만,. UI 에서의 설정이 훨씬더 편할것 같습니다. URL Rewrite Module 에 대한 상세한 설명은 다음 페이지를 참고해 보시기 바랍니다.

http://learn.iis.net/page.aspx/460/using-url-rewrite-module/

스샷등 매우 상세하게 설명되어 있습니다.^^

출처 : http://www.wssplex.net/Tools/UsefulTools.aspx?Seq=87
2009/08/25 14:07 2009/08/25 14:07
CID를 구축하는데 CID장비에서는 전화번호를 "-" 없이 번호를 붙여서 전송

고객 DB에는 고객 연락처에 "-"붙여서 사용.....

WHERE 절에 Replace(tel_no, '-', '') = @연락처....이렇게 하려니 조건절에 함수를 사용해서

꺼림직하여 프로시저로 작성



/* TITLE : CID에서 오는 전화번호 중간에 "-" 정확하게 삽입 작성자 : 지현명 작성일자 : 2009년 7월 20일 내용 : - 고객 DB에 전화번호와 핸드폰번호가 중간에 "-"가 삽입되어 저장 - 기존 다른 App와 연동되어 있기 때문에 DB에 저장된 데이터를 "-"없이 변경 못함. - 컬럼 두개 추가하는것도 생각해 봤는데 용량만 차지.... - CDI에서 "-"없이 들어오는 번호를 핸드폰/국선 구분하여 "-" 삽입후 고객연락처와 비교 - WHERE절에서 Replace(TEL_NO_COM, '-', '') = @TEL_NO ..이렇게 하면 인덱스를 이용 못하고 - 검색시 상당히 오래 걸림 <- 정원혁 선생님 교제에 있음... -- 국내 지역번호 --서울 02 경기 031 인천 032 강원 033 충남 041 대전 042 충북 043 부산 051 울산 052 대구 053 경북 054 경남 055 전남 061 광주 062 전북 063 제주 064 --서울 말고는 전부 3자리... */ -- EXEC CID_CUST_INFO_SEARCH '01190773532' ALTER PROC CID_CUST_INFO_SEARCH @TEL_NO VARCHAR(20) AS DECLARE @TEL_NO_1 VARCHAR(3) --통신사/지역번호 DECLARE @TEL_NO_2 VARCHAR(4) --중간번호 DECLARE @TEL_NO_3 VARCHAR(4) -- 최종번호 DECLARE @TEL_NO_SEARCH VARCHAR(20) -- '-' 붙여진 최종번호 DECLARE @TEL_NO_TMP VARCHAR(20) --오리지널번호 임시 저장 SET @TEL_NO = LTRIM(RTRIM(@TEL_NO)) SET @TEL_NO_TMP = @TEL_NO IF CHARINDEX('01', LEFT(RTRIM(LTRIM(@TEL_NO)), 2)) = 1 BEGIN -- 핸드폰 일 경우 SET @TEL_NO_1 = LEFT(@TEL_NO, 3) -- 01190771234->011 -- SET @TEL_NO = REPLACE(@TEL_NO, @TEL_NO_1, '') -- 01190771234->90771234 SET @TEL_NO = SUBSTRING(@TEL_NO, 4, LEN(@TEL_NO)) -- 통신사 뒷자리부터 잘라내기 SET @TEL_NO_3 = RIGHT(@TEL_NO, 4) -- 90771234->1234 SET @TEL_NO_2 = REVERSE(SUBSTRING(REVERSE (@TEL_NO), 5, LEN(@TEL_NO)-4 )) -- 90771234->리버스->43217709->7709만 잘라냄..'-4'는 최종번호 잘라낸 자리수->리버스->9077 SET @TEL_NO_SEARCH = @TEL_NO_1 + '-' + @TEL_NO_2 + '-' + @TEL_NO_3 END ELSE BEGIN --일반전화 IF LEFT(@TEL_NO, 2) = '02' BEGIN SET @TEL_NO_1 = LEFT(@TEL_NO, 2) -- 0221041234 -> 02 -- SET @TEL_NO = REPLACE(@TEL_NO, @TEL_NO_1, '') -- 0221041234->21041234 SET @TEL_NO = SUBSTRING(@TEL_NO, 3, LEN(@TEL_NO)) SET @TEL_NO_3 = RIGHT(@TEL_NO, 4) -- 21041234->1234 SET @TEL_NO_2 = REVERSE(SUBSTRING(REVERSE (@TEL_NO), 5, LEN(@TEL_NO)-4 )) -- 21041234->리버스->43214012->4012만 잘라냄..'-4'는 최종번호 잘라낸 자리수->리버스->2104 SET @TEL_NO_SEARCH = @TEL_NO_1 + '-' + @TEL_NO_2 + '-' + @TEL_NO_3 END ELSE BEGIN SET @TEL_NO_1 = LEFT(@TEL_NO, 3) -- 0332542011 -> 031 -- SET @TEL_NO = REPLACE(@TEL_NO, @TEL_NO_1, '') -- 0332542011->2542011 SET @TEL_NO = SUBSTRING(@TEL_NO, 4, LEN(@TEL_NO)) SET @TEL_NO_3 = RIGHT(@TEL_NO, 4) -- 21040152->0152 SET @TEL_NO_2 = REVERSE(SUBSTRING(REVERSE (@TEL_NO), 5, LEN(@TEL_NO)-4 )) -- 2542011->리버스->1102452->452만 잘라냄..'-4'는 최종번호 잘라낸 자리수->리버스->254 SET @TEL_NO_SEARCH = @TEL_NO_1 + '-' + @TEL_NO_2 + '-' + @TEL_NO_3 END END SELECT A.CUST_CD, A.CUST_NM, A.TEL_NO_COM, A.TEL_NO_MOB, A.STR_CD, (SELECT STR_CD_NM FROM RMSMST1 WITH(NOLOCK) WHERE STR_CD = A.STR_CD) STR_NM, A.CUST_RANK_DIV, (SELECT DESCRP FROM RMBMCM1 WITH(NOLOCK) WHERE GRP_CD = '58' AND DETAIL_CD = A.CUST_RANK_DIV) CUST_RANK, -- 등급명 A.ZIPCODE, A.ADDR1 + ' ' + A.ADDR2 + ' '+ A.ADDR3 + ' ' + A.ADDR4 + ' ' + A.ADDR5 AS ADDR FROM RCCMCS1 A WITH(NOLOCK) WHERE CASE WHEN CHARINDEX('01', LEFT(RTRIM(LTRIM(@TEL_NO_TMP)), 2)) = 1 THEN A.TEL_NO_MOB --핸드폰일경우 ELSE A.TEL_NO_COM --국선일경우 END = @TEL_NO_SEARCH
2009/08/17 10:28 2009/08/17 10:28
-- 혹시 DB가 없는 경우 생성
--CREATE DATABASE DBA
--ALTER DATABASE DBA SET RECOVERY SIMPLE


-- 로깅용 테이블 없으면 생성
IF object_id('NHN_runParalellSQL') is null BEGIN
CREATE TABLE NHN_runParalellSQL (jobName nvarchar(2000), regDate datetime, status varchar
(50))
END

DECLARE @jobNames table (jobNo int identity(1,1), jobName nvarchar(4000))
DECLARE @jobNames2 table (jobNo int, jobName nvarchar(4000))
DECLARE @v_jobName nvarchar(4000)
, @v_cmd nvarchar(4000)
, @v_DBName nvarchar(4000)
, @initTime datetime

SET @initTime = getdate()

--=======================================
-- 병렬처리용 JOB을 통해 수행 시작
-- 이 부분만 채워 넣어서 사용하면 된다.
--=======================================
SELECT @v_jobName = 'WORKING_SUBJOB1', @v_cmd = 'exec BBS1.DB1.dbo.AP_STAT_MONTHLY_feisia',
@v_DBName = 'DBA'
exec runParallelSQL @jobName = @v_jobName, @cmd = @v_cmd, @DBName = @v_DBName
insert into @jobNames (jobName) select @v_jobName

SELECT @v_jobName = 'WORKING_SUBJOB2', @v_cmd = 'exec BBS2.DB2.dbo.AP_STAT_MONTHLY_feisia',
@v_DBName = 'DBA'
exec runParallelSQL @jobName = @v_jobName, @cmd = @v_cmd, @DBName = @v_DBName
insert into @jobNames (jobName) select @v_jobName

SELECT @v_jobName = 'WORKING_SUBJOB3', @v_cmd = 'exec BBS3.DB3.dbo.AP_STAT_MONTHLY_feisia',
@v_DBName = 'DBA'
exec runParallelSQL @jobName = @v_jobName, @cmd = @v_cmd, @DBName = @v_DBName
insert into @jobNames (jobName) select @v_jobName

SELECT @v_jobName = 'WORKING_SUBJOB4', @v_cmd = 'exec BBS4.DB4.dbo.AP_STAT_MONTHLY_feisia',
@v_DBName = 'DBA'
exec runParallelSQL @jobName = @v_jobName, @cmd = @v_cmd, @DBName = @v_DBName
insert into @jobNames (jobName) select @v_jobName
--=======================================
-- 병렬처리용 JOB을 통해 수행 끝
--=======================================




-- 등록한 작업의 후속처리 부분
-- 각 서브작업들이 잘 수행되는지 체크하고, 실패하는 서브작업이 있을경우 오류를 발생시키며 종료한다.
DECLARE @cnt int
, @totalCnt int
SELECT @cnt = 1
, @totalCnt = (SELECT COUNT(*) FROM @jobNames)

delete @jobNames2
insert into @jobNames2 select * from @jobNames

while 1=1 BEGIN
SELECT @v_jobName = jobName FROM @jobNames2 WHERE jobNo = @cnt

-- JOB 생성에 실패한 경우 체크
IF EXISTS (SELECT * FROM NHN_runParalellSQL with(nolock) where jobName = @v_jobName and
regDate > @initTime and status = 'FAILED') BEGIN
RAISERROR ('자동 병렬처리 배치작업 실패', 19, 1) with log
BREAK
END

-- JOB 실행에 실패한 경우 체크
IF EXISTS (
select * from msdb..sysjobhistory
where run_status <> 1 -- 작업 실패
and job_id = (select top 1 job_id from msdb..sysjobs with(nolock) where
name = @v_jobName)
and convert(varchar(50), run_date)+right('0'+convert(varchar(50), run_time),
6) >= convert(char(8), @initTime, 112)+replace(convert(char(8), @initTime, 108), ':', '')
) BEGIN
RAISERROR ('자동 병렬처리 배치작업 실패', 19, 1) with log
BREAK
END

-- JOB 실행에 성공한 경우 체크
IF EXISTS (
select * from msdb..sysjobhistory
where run_status = 1 -- 작업 성공
and job_id = (select top 1 job_id from msdb..sysjobs with(nolock) where
name = @v_jobName)
and convert(varchar(50), run_date)+right('0'+convert(varchar(50), run_time),
6) >= convert(char(8), @initTime, 112)+replace(convert(char(8), @initTime, 108), ':', '')
) BEGIN
insert into NHN_runParalellSQL select @v_jobName, getdate(), 'END'
EXECUTE msdb.dbo.sp_delete_job @job_name = @v_jobName

DELETE @jobNames2 WHERE jobNo = @cnt
UPDATE @jobNames2 SET jobNo = jobNo-1 WHERE jobNo > @cnt
SET @totalCnt = @totalCnt - 1

-- 모든 JOB이 실행에 성공한 경우 중단
IF @totalCnt = 0 BREAK
END

SET @cnt = (@cnt % @totalCnt) + 1
END














--=================================
---- 작업을 위한 SP 생성
--=================================

CREATE PROC runParallelSQL
@jobName nvarchar(4000)
, @cmd nvarchar(4000)
, @DBName nvarchar(4000)
AS

declare @jobStepName nvarchar(4000)
select @jobStepName = @jobName+'_단계'

-- JOB 생성
BEGIN TRANSACTION           
  DECLARE @JobID BINARY(16) 
  DECLARE @ReturnCode INT   
  SELECT @ReturnCode = 0    
IF (SELECT COUNT(*) FROM msdb.dbo.syscategories WHERE name = N'[Uncategorized (Local)]')
< 1
  EXECUTE msdb.dbo.sp_add_category @name = N'[Uncategorized (Local)]'

-- 동일한 이름을 가진 작업이 있으면 삭제
  SELECT @JobID = job_id    
  FROM   msdb.dbo.sysjobs   
  WHERE (name = @jobName)      
  IF (@JobID IS NOT NULL)   
  BEGIN 
  -- 작업이 다중 서버 작업인지 점검 
  IF (EXISTS (SELECT  *
             FROM    msdb.dbo.sysjobservers
             WHERE   (job_id = @JobID) AND (server_id <> 0)))
  BEGIN
   -- 스크립트를 중단하십시오.
   RAISERROR (N'이 이름으로 된 다중 서버 작업이 이미 존재하기 때문에 특정작업_하위작업 작업을 가
져올 수 없습니다.', 16, 1)
   GOTO QuitWithRollback 
  END
  ELSE
   -- [로컬] 작업 삭제
   EXECUTE msdb.dbo.sp_delete_job @job_name = @jobName
   SELECT @JobID = NULL
  END

BEGIN

-- 작업 추가
  EXECUTE @ReturnCode = msdb.dbo.sp_add_job @job_id = @JobID OUTPUT , @job_name =
@jobName, @owner_login_name = N'agent', @description = N'설명이 없습니다.', @category_name =
N'[Uncategorized (Local)]', @enabled = 0, @notify_level_email = 0, @notify_level_page = 0,
@notify_level_netsend = 0, @notify_level_eventlog = 2, @delete_level= 0
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

-- 작업 단계 추가
  EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id = 1,
@step_name = @jobStepName, @command = @cmd, @database_name = @DBName, @server = N'',
@database_user_name = N'', @subsystem = N'TSQL', @cmdexec_success_code = 0, @flags = 0,
@retry_attempts = 0, @retry_interval = 1, @output_file_name = N'', @on_success_step_id = 0,
@on_success_action = 1, @on_fail_step_id = 0, @on_fail_action = 2
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
  EXECUTE @ReturnCode = msdb.dbo.sp_update_job @job_id = @JobID, @start_step_id = 1

  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

-- 대상 서버 추가
  EXECUTE @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @JobID, @server_name =
N'(local)'
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

END
COMMIT TRANSACTION         

insert into NHN_runParalellSQL select @jobName, getdate(), 'START'
-- JOB 수행
EXECUTE msdb..sp_start_job @job_name = @jobName

GOTO   EndSave             
QuitWithRollback:
  IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
insert into NHN_runParalellSQL select @jobName, getdate(), 'FAILED'
RAISERROR ('자동 병렬처리 배치작업 실패', 19, 1) with log
EndSave:


GO



하만철 / Ha Man-cheol
EMail : feisia@hanmail.net
2009/08/17 10:27 2009/08/17 10:27
<html> <head> <script> function ju(){ a=document.f1.image.value; document.write("<a href=처음시작하는문서이름>처음으로..</a><br>"); document.write("<img src="+a+">"); } </script> </head> <body> <form name=f1> <input type="file" size="50" name="image" onchange="ju()"> </form> </body> </html>
2009/08/17 10:26 2009/08/17 10:26
Ajax + MySQL 5.0 버젼에서 한글처리하기 by Python
MySQL 5.0 버젼이 유니코드처리 문제로 이런저런 고민거리를 생산하고 있다고 들었습니다. 제로보드가 5.0 db와 트러블로 인해서 골치아프다고 들었었고요. Ajax를 하는 분이라면 한글처리에 조금 신경을 써줘야 한다는 것을 아실 것이고 저도 일단 어느정도 처리가 잘 될뻔 하다가 삽질하였네요. 3일치 분량이었습니다.

환경 : Apache 2.0 + MySQL 5.0 + Python 2.5 + mod_python + MySQLdb

자바 스트립트 전송시의 중요한 부분
  var name = "name=" + encodeURIComponent($('name').value);

쿼리 처리시 중요한 부분
query = "INSERT INTO `test` (`num`, `name`) VALUES (NULL, '%s')" % name
query = query.decode('utf-8')
query = query.encode('euckr')

결국 삽질은 디코딩한걸 다시 euckr로 인코딩을 다시 해주면 되는 것을 몰라서 해맨것 이라는 것... MySQL 5.0은 어디에 지뢰가 있을지 모른다! 조심하자!
2009/08/17 10:22 2009/08/17 10:22

Eclips 파일 종류별로 ascii로 저장할건지, binary로저장 할것인지 정의

window>preference>Team-file-content  여기서 작업하면 됨

2009/08/17 10:21 2009/08/17 10:21

menu>run>debug>오른쪽 탭의  sourse에서

YP>WEB-INF를 add버튼을 눌러서 추가하면 된다

헌데

YP>WEB-INF>src>yp>admin폴더까지 가서 add했더니 안�다 여기서 이것저것 add하면 어쨌든 된다.

헌데 더 중요한 것은

Failed to connect to remote VM. Connection refused.

이런 오류가 생기는 것은

1.현대자동차인경우

먼저 서버를 띄우고 난 다음 디버깅 해야하는데 그렇지 않았기 때문이다. 톰캣이던 제우스던 롬보즈던 먼저 웹서버를 띄우고 나서

디버깅해야한다.

run>debug>Remote Java Application

Connct탭

Name : ALP_AppJava_ML

Project : ALP_AppJava_ML

Connection Type: Standard(Socket Attach)

Connection Properties:

Host : localhost

Port : 8000

Source 탭

Default

2.TLMS인경우

아래그림 자바모드에서 디버그모드로 변경만 해도 디버깅이 된다..... 1번처럼 굳이 서버를 띄우고 나서 디버깅하지 않아도 된다는 이야기

사용자 삽입 이미지

2009/08/17 10:19 2009/08/17 10:19

1. Server(SQL Server 2000 기준)

* 시작 - 모든 프로그램 - Microsoft SQL Server - 서버 네트워크 유틸리티

* 사용할 수 있는 프로토콜에서 TCP/IP를 선택 후 속성

* 원하는 포트 번호로 변경

* SQL Server 재시작


2. Client(ADO를 이용하여 접속할 때)

(서버 주소가 127.0.0.1 이라고 하고, 변경한 포트번호가 3000 일 때)

* "Provider='SQLOLEDB';Data Source='127.0.0.1,3000';Initial Catalog='DB이름';User ID='유저ID';Password='비번';"

* ip 뒤에 포트 번호를 붙일 때 콜론( : ) 이 아닌 콤마( , ) 임에 주목
2009/08/16 18:07 2009/08/16 18:07

IIS7 설치
IIS7 이상 버전을 사용하려면 Vista 또는 Server 2008을 써야 한다. 필자는 Vista만 써봤으므로 그것을 기준으로 하겠다.

제어판 -> 프로그램 -> Windows 기능 추가/제거로 들어가 Windows 기능 창을 연다.
인터넷 정보 서비스 -> 웹 관리 도구를 체크한다. (FTP 등 필요한 것을 더 체크해도 된다.)
확인 눌러서 설치.
웹브라우저에서 http://localhost 또는 http://127.0.0.1을 열고 환영 페이지가 나오는지 확인한다.
기본 웹디렉토리는 C:\inetpub\wwwroot\이므로, UAC 없이 접근하려면 이 폴더의 속성 -> 보안 탭에서 자신의 사용자 계정에 모든 권한을 허가해주면 좀더 편하게 쓸 수 있다.
※ Vista SP1부터는 IIS7 자체에 FastCGI 모듈이 내장되어 있으므로 그것을 쓰면 된다.

PHP 설치
php.net에서 최신 PHP 버전을 받아 설치한다. (5.2 이상 버전 권장, 글 쓰는 현재 5.2.6이 최신 버전임)
이때 installer보다는 zip package를 권장하는데, 그 이유는 isntaller는 설치는 편리하지만 확장 기능(gd, mysql 등등)이 하나도 안 들어있기 때문이다. 나중에 zip package를 받아 확장기능 폴더만 복사해넣어도 되긴 하나 한 번에 하는 게 편하니까 zip package로 바로 하자.

FastCGI를 이용하면 각 연결을 각각의 독립된 프로세스가 처리하게 되므로, 최대한의 성능을 내기 위해 non-thread-safe 패키지를 이용하는 것이 좋다.
적당한 디렉토리에 압축을 푼다.
zip으로 받았을 경우는 그냥 편하게 C:\php에 풀지만, installer로 하면 C:\Program Files\PHP에 설치되므로 참고한다. 여기서는 C:\PHP에 깔았다고 가정하겠다.
IIS 관리자를 열고 왼쪽의 트리에서 사이트 -> Default Web Site를 클릭하면 오른쪽에 관련 작업 아이콘들이 나타난다.
그중 [처리기 매핑]을 더블클릭하고, 오른쪽의 작업 메뉴에서 [모듈 매핑 추가...]를 누른다.
추가 대화상자에서 [요청 경로] : "*.php", [모듈] : "FastCgiModule", [실행 파일 (옵션)] : "C:\PHP\php-cgi.exe", [이름] : "적당히 알아서. 필자는 PHP via FastCGI로 설정했음." 와 같이 설정하고 확인을 누른다.
웹디렉토리(wwwroot)에 info.php를 만들고 "<?php phpinfo(); ?>"라고 써넣은 다음 http://localhost/info.php를 쳐보자.
웹브라우저에 php 정보 화면이 나오면 잘 된 것이다.
Tips!

파일 업로드 기능 사용시 권한 관련 문제를 해결하려면 php.ini에서 uploaded_tmp_dir을 기본값이 아닌 다른 것으로 바꿔주는 것이 좋다. (IIS_IUSRS가 모든 권한을 가지는 디렉토리로)
php.ini의 설정을 변경하고 이것을 적용하려면, 웹사이트가 아닌 그 웹사이트에 연결된 응용프로그램 풀을 재생(refresh)해주면 된다. ISAPI 핸들러 형태로 php를 사용할 경우는 웹서버를 재시작하면 되지만, FastCGI의 경우 php가 외부 프로세스 형태로 실행되므로(IIS7의 기본 설정을 이용할 경우 NETWORK SERIVCE 사용자 권한을 가진다) 이를 관리해주는 응용프로그램 풀을 다시 로드해야 한다.
FastCGI를 위한 php.ini 추가 설정 참고:
fastcgi.impersonate = 1
cgi.fix_pathinfo = 1
cgi.force_redirect = 0
extension_dir = "./ext"
MySQL 설치
mysql.com에서 적당한 버전을 받아 설치한다. 64bit 운영체제를 사용하더라도, php의 64bit용 Windows binary가 제공되지 않으므로 32bit를 쓰는 것이 편하다.
패키지 중에 Windows Essentials를 받으면 무리 없다.
(64bit와도 연동은 가능하지만 설정 과정에서 약간의 귀찮음이 있다.)
설치 완료 후 MySQL Server Instance Config Wizard를 실행한다.
설정 과정에서 root 암호 및 기본 인코딩(기본 인코딩은 UTF-8 권장) 등을 지정하고, 커맨드 프롬프트에서 바로 실행할 수 있도록 PATH 추가 옵션을 체크해준다.
PHP에서 인식시키기 위해, C:\PHP\php.ini에서 주석처리되어 있는 extension=php_mysql.dll을 주석 해제한다. (줄 앞에 붙은 세미콜론을 지워준다)
내용이 없으면 적당한 곳에 추가해주면 된다. 취향에 따라 gd, mysqli, curl 등등을 켜준다.
MySQL 설치된 폴더 안의 bin 폴더에 들어있는 libMYSQL.dll을 C:\Windows\System32 (32bit 윈도의 경우) / C:\Windows\SysWOW64 (64bit 윈도의 경우)에 복사한다.
다시 http://localhost/info.php를 열고 mysql 모듈이 잘 올라왔는지 확인한다. 만약 안 보일 경우 IIS 관리자에서 사이트를 재시작해준다.
커맨드 프롬프트에서 mysql -uroot -p를 실행하여 사용자 계정 등을 설정한다. 자세한 건 검색. -_-
간단한 php 스크립트를 만들어 접속 여부를 테스트해본다.

2009/08/16 18:06 2009/08/16 18:06
Logparser는 MS에서 만든 강력한 IIS, W3C, 이벤트 로그 분석툴로서 SQL 쿼리타입으로 조건별 검색할 수 있는 강력한 툴입니다.

1) 가장 최근에 생성된 시간을 기준으로 ASP 스크립트를 변조한 Trojan Files 여부를 진단
 
C:\logparser2.2\logparser -i:FS "SELECT TOP 20 Path, CreationTime FROM C:\inetpub\wwwroot\*.* ORDER BY CreationTime DESC" -rtp:-1 


2). 가장 최근에 수정된 Files 로그 찾기

C:\logparser2.2\logparser -i:FS "SELECT TOP 20 Path, LastWriteTime FROM C:\inetpub\wwwroot\*.* ORDER BY LastWriteTime DESC" -rtp:-1   
  
3). 해커가 Trojan Files을 삭제한 경우에 HTTP 200 서버코드 흔적 로그를 찾는다.
 
C:\logparser "SELECT DISTINCT TO_LOWERCASE(cs-uri-stem) AS URL, Count(*) AS Hits FROM ex*.log WHERE sc-status=200 GROUP BY URL ORDER BY URL"    -rtp:-1  
 
* nc.exe, tini.exe, root.exe, cmd.exe, upload.asp, aspexec.asp, cmd.asp 같은 파일 이름이 있으면 의심

4) Script Abuse 분석(가장 많은 Request 요청을 받은 Executable 파일의 확장자 확인)

C:\logparser -i:FS "SELECT TO_LOWERCASE(SUBSTR(Name, LAST_INDEX_OF(Name, '.'),  STRLEN(Name))) AS Extenstion, Count(*) AS Files FROM C:\inetpub \wwwroot\*.*, C:\inetpub\scripts\*.* WHERE Attribute NOT LIKE 'D%' GROUP BY Extenstion ORDER BY Files DESC" -rtp:-1 

* 특히, .ASP, .DLL 파일 요청을 유심히 봐야함

5) HTTP 서버 500 에러코드 검사

C:\logparser "SELECT [cs-uri-stem], [cs-uri-query], Count(*) AS [Hits] FROM c:\logs\web\ex*.log WHERE sc-status = 500 GROUP BY [cs-uri-stem], [cs-uri-query] ORDER BY [hits], [cs-uri-stem] DESC" -rtp:-1 -i:iisw3c
 

6) 가장 많은 Request Hit 수를 높음 ASP, DLL 파일 확인

C:\logparser "SELECT TO_STRING(TO_TIMESTAMP(date, time), 'yyyy-MM-dd') AS Day, cs-uri-stem, Count(*) AS Total ex*.log WHERE (sc-status<400 or sc-status>=500) AND (TO_LOWERCASE(cs-uri-stem) LIKE '%.asp%' OR TO_LOWERCASE(cs-uri-stem) LIKE '%.exe') GROUP BY Day, cs-uri-stem ORDER BY cs-uri-stem, Day" -rtp:-1 

7) 시간당 에러수가 가장 많이 발생한 날짜 확인
 
C:\logparser "SELECT date, QUANTIZE(time, 3600) AS hour, sc-status, Count(*) AS Errors FROM ex03*.log WHERE sc-status>=400 GROUP BY date, hour, sc-status HAVING Errors>25 ORDER BY Error DESC" -rtp:-1 

* 25개 이상의 에러코드(404코드)를 발생한 날짜와 시간 결과를 출력

8) 하루동안 50번이상 동일 페이지에 접속을 시도한 클라이언트 IP 확인
 
C:\logparser "SELECT DISTINCT date, cs-uri-stem, c-ip, Count(*) AS Hits FROM ex*.log GROUP BY date, c-ip, cs-uri-stem HAVING Hits>50 ORDER BY Hits DESC" -rtp:-1 

9) 하루동안 50번이상 동일 페이지에 접속을 시도한 클라이언트 IP 확인
 
C:\logparser "SELECT DISTINCT date, cs-uri-stem, c-ip, Count(*) AS Hits FROM ex*.log GROUP BY date, c-ip, cs-uri-stem HAVING Hits>50 ORDER BY Hits DESC" -rtp:-1 

10)  모든 ASP 에러 기록 확인
 
C:\logparser "SELECT cs-uri-query, Count(*) AS Total FROM ex*.log WHERE sc-status>=500 GROUP BY cs-uri-query ORDER BY Total DESC" -rtp:-1 

* 특히, ODBC와 ADO 에러는 SQL Injection 가능성이 있으므로 주의깊게 살펴봐야 함

11) 스크립트 및 Executable 파일의 HTTP 서버 코드 기록 확인
 
C:\logparser "SELECT cs-uri-stem, sc-status, Count(*) AS Total FROM ex*.log WHERE TO_LOWERCASE(cs-uri-stem) LIKE '%.asp%' or TO_LOWERCASE(cs-uri-stem) LIKE '%.exe%' GROUP BY cs-uri-stem, sc-status ORDER BY cs-uri-stem, sc-status" -rtp:-1 

12) Win32 Status Code 분석을 통한 Attack 확인
 
C:\logparser "SELECT cs-uri-stem, WIN32_ERROR_DESCRIPTION(sc-win32-status) AS Error, Count(*) AS Total FROM ex*.log WHERE sc-win32-status>0 AND (TO_LOWERCASE(cs-uri-stem) LIKE '%.asp%' OR TO_LOWERCASE(cs-uri-stem) LIKE '%.exe%') GROUP BY cs-uri-stem, Error ORDER BY cs-uri-stem, Error" -rtp:-1
 

13) HTTP Method 통계 분석
 
C:\logparser "SELECT cs-uri-stem, cs-method, Count(*) AS Total FROM ex*.log WHERE (sc-status<400 or sc-status>=500) AND (TO_LOWERCASE(cs-uri-stem) LIKE '%.asp%' or TO_LOWERCASE(cs-uri-stem) LIKE '%.exe%') GROUP BY cs-uri-stem, cs-method ORDER BY cs-uri-stem, cs-method" -rtp:-1
2009/08/11 14:50 2009/08/11 14:50
아래 리스트에 있는 확장 프로시저는 가급적이면 모두 제거해 주는 것이 좋습니다.
 
use master
exec sp_dropextendedproc 'xp_cmdshell'
exec sp_dropextendedproc 'xp_dirtree'
exec sp_dropextendedproc 'xp_enumgroups'
exec sp_dropextendedproc 'xp_fixeddrives'
exec sp_dropextendedproc 'xp_loginconfig'
exec sp_dropextendedproc 'xp_enumerrorlogs'
exec sp_dropextendedproc 'xp_getfiledetails'
exec sp_dropextendedproc 'Sp_OACreate'
exec sp_dropextendedproc 'Sp_OADestroy'
exec sp_dropextendedproc 'Sp_OAGetErrorInfo'
exec sp_dropextendedproc 'Sp_OAGetProperty'
exec sp_dropextendedproc 'Sp_OAMethod'
exec sp_dropextendedproc 'Sp_OASetProperty'
exec sp_dropextendedproc 'Sp_OAStop'
exec sp_dropextendedproc 'Xp_regaddmultistring'
exec sp_dropextendedproc 'Xp_regdeletekey'
exec sp_dropextendedproc 'Xp_regdeletevalue'
exec sp_dropextendedproc 'Xp_regenumvalues'
exec sp_dropextendedproc 'Xp_regread'
exec sp_dropextendedproc 'Xp_regremovemultistring'
exec sp_dropextendedproc 'Xp_regwrite'
drop procedure sp_makewebtask
go
2009/08/11 14:49 2009/08/11 14:49

MS SQL 2005 부터는 xp_cmdshell를 오픈할 수 있는 방법이 변경되었습니다.

1. SQL2005 하에서 'xp_cmdshell' Open하는 방법 :
 

> sp_configure 'show advanced options', 1;
go
RECONFIGURE;
go

> sp_configure 'xp_cmdshell', 1;
go
RECONFIGURE;
go


2. SQL2005 에서 'OPENROWSET' 오픈하는 방법:

> sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO

> sp_configure 'Ad Hoc Distributed Queries', 1;
GO
RECONFIGURE;
GO

2009/08/11 14:04 2009/08/11 14:04

MS SQL 2005 서버가 점점 많아지면서 진단시 기존의 2000과 쿼리명에 약간의 변경이 있습니다.

1. 테이블의 모든 계산 열(Computed Column) 찾기

1) SQL SERVER 2000
select name from syscolumns where id =object_id('TableName') and iscomputed=1


2) SQL SERVER 2005
select name from sys.computed_columns where object_id =object_id('TableName')

[참고]

SQL Server 2005에서는 계산된 열을 지속형(Persisited)으로 설정할 수 있습니다. 따라서, 지속형(Persisted)으로 설정되지 않은 계산된 열을 확인하기 위해서 다음과 같이 조건을 추가할 수 있습니다.:

select * from sys.computed_columns where is_persisted=0

2. ID열이 있는 테이블 목록 조사하기

1) SQL SERVER 2000
select object_name(id),name from syscolumns where columnproperty(id,name,'IsIdentity')=1

2) SQL SERVER 2005
select object_name(object_id),name from sys.identity_columns

[참고]
SQL Server 2005 에서는 id열의 가장 마지막 값을 별도로 저장합니다. 다음과 같은 쿼리를 이용해서 이를 확인할 수 있습니다..

select name,last_value from sys.identity_columns

3. 현재 Instance의 모든 데이터베이스 알아내기

1) SQL SERVER 2000
select name from master..sysdatabases

2) SQL SERVER 2005
select name from sys.databases

4. 데이터베이스의 모든 저장 프로시저 리스트 알아내기

1) SQL SERVER 2000
select name from sysobjects where type='P'

2) SQL SERVER 2005
select name from sys.procedures

[참고]
다음과 같은 조건으로 저장 프로시저가 복제에서 이용되는지 여부와 SQL Server가 시작할 때 자동으로 시작하는지의 여부를 확인할 수 있습니다.
select name from sys.procedures where is_execution_replicated=1
select name from sys.procedures where is_auto_executed=0

5. 데이터베이스의 모든 테이블 리스트 알아내기

1) SQL SERVER 2000
select name from sysobjects where type='U'

2) SQL SERVER 2005
select name from sys.tables

[참고] : 다음과 같은 조건으로 복제되는 테이블의 리스트를 확인할 수 있습니다.
select * from sys.tables  where is_replicated =1

6. 데이터베이스의 모든 뷰 리스트 알아내기

1) SQL SERVER 2000
select name from sysobjects where type='V'

2) SQL SERVER 2005
select name from sys.views

7. 데이터베이스의 모든 트리거 리스트 알아내기

1) SQL SERVER 2000
select name from sysobjects where type='TR'

2) SQL SERVER 2005
select name from sys.triggers where parent_class=1

[참고]
다음과 같은 조건으로 어셈블리(CLR) 트리거와 SQL 트리거를 구분할 수 있습니다. (TA : 어셈블리 트리거, TR : SQL 트리거) 또한 After 트리거인지 Instead Of 트리거인지도 구분 가능합니다.
select name from sys.triggers where type='TA'
select name from sys.triggers where type='TR'
select name from sys.triggers where is_instead_of_trigger=1

8. 서버의 모든 로그인 리스트 알아내기

1) SQL SERVER 2000
select * from master..syslogins where isntgroup=0 and isntname=0

2) SQL SERVER 2005
select * from sys.sql_logins

9. 데이터베이스의 모든 SQL 개체에 대한 종속성 확인하기

1) SQL SERVER 2000
select * from sysdepends

2) SQL SERVER 2005
select * from sys.sql_dependencies

10. SQL Server의 모든 데이터 유형 확인하기

1) SQL SERVER 2000
select * from systypes

2) SQL SERVER 2005
select * from sys.systypes

11. SQL Server의 모든 에러 메시지 확인하기

1) SQL SERVER 2000
select * from master..sysmessages

2) SQL SERVER 2005
select * from sys.messages

12. 현재 데이터베이스의 데이터 파일 확인하기

1) SQL SERVER 2000
select name,filename from sysfiles

2) SQL SERVER 2005
select name, physical_name from sys.database_files

13. 현재 데이터베이스의 모든 인덱스의 유형 확인하기

1) SQL SERVER 2000
sysindexes 테이블의 indid 열을 이용해서 구분

2) SQL SERVER 2005
select object_name(object_id),name, type_desc  from sys.indexes where type_desc ='CLUSTERED'
select object_name(object_id),name, type_desc  from sys.indexes where type_desc ='HEAP'
select object_name(object_id),name, type_desc  from sys.indexes where type_desc ='NONCLUSTERED'
select object_name(object_id),name, type_desc  from sys.indexes where type_desc ='XML'

2009/08/11 14:00 2009/08/11 14:00