Search Results for '전체 분류'
2064 posts related to '전체 분류'
- 2009/04/27 Classic ASP용 XMLRPC Class
- 2009/04/27 Classic ASP용 Database Object
- 2009/04/27 외부 이미지 저장 소스
- 2009/04/27 외부 이미지 저장 하는 방법 저장 하기 php
- 2009/04/27 외부 이미지 서버에 저장하기
- 2009/04/27 [함수] 세이케스트 방송정보 알아내기 2009.3.29
- 2009/04/27 CSS 브라우저별 핵 정리
- 2009/04/27 [Tip&Tech] 팁텍에 올리기는 너무 허접해서 iframe resize 간단히
- 2009/04/27 [복구/삭제] testdisk 디스크파티션 복구프로그램
- 2009/04/27 [파일관리] Tag&Rename v3.5.1
- 2009/04/27 [파일관리] PowerISO v4.4
- 2009/04/27 [포터블] Adobe Reader Lite 9.1.0.6 1
- 2009/04/27 [시스템 관리] A.I v081210 XP/Vista/2008/Office 인증도구
- 2009/04/21 Trim 공백제거
- 2009/04/21 윈도우 DoS 공격 방어 레지스트리 권장값과, 보안관련 레지스트리 키
- 2009/04/21 vbscript decode
- 2009/04/21 프록시 리스트 proxy list
- 2009/04/21 테이블명세서생성스크립트::SQL Database documentation script
- 2009/04/21 FSO example
- 2009/04/21 read/write configuration class (xml version)
- 2009/04/21 dbhelper class
- 2009/04/21 view source &asp coloring
- 2009/04/21 Class implementation for using webservices in ASP
- 2009/04/21 ASP JSON Utility
- 2009/04/21 fckeditor 이미지 업로드 시 한글명 깨지는 문제
- 2009/04/21 경고없이 창닫기
- 2009/04/21 HTML, js 소스정리기 - editplus plugin
- 2009/04/21 mssql의 my sql의 password() function과 비슷한 함수
- 2009/04/21 보안면에서나 성능면에서 exec보다 유리한 sp_executesql
- 2009/04/21 먼저 아래와 같이 c#을 작성하여 test.cs로 저장합니다.
일단 버그 있을지도 모릅니다... ㅠㅠ
일단 XMLRPC부터 소개하자면
http://xmlrpc.com/
http://wiki.kldp.org/HOWTO//html/XML-RPC-HOWTO/xmlrpc-howto-intro.html
간단하게 MS의 SOAP과 유사하게,
'XML-RPC는 HTTP를 통한 간단하고 이식성 높은 원격 프로시져 호출 방법이다' 이라고 하네요
(제가 설명을 잘 못해서...)
일단 압축을 여시면 파일을 3가지가 있는데
class_xmlrpc.asp 이하 2가지 파일 (class_hashtable.asp / class_gto.asp) 은
의존성때문에 같이 넣어주어야 할껍니다 -.-;
2. 레퍼런스
- 생성자
* Constructor void xmlRPC() - XMLRPC Class를 생성합니다.
- Properties
* Public String method - XMLRPC 서버측 method를 지정해줍니다.
* Public Mixed data - XMLRPC 서버에 보내줄 데이터를 지정하여 줍니다. 지정하는 순간 XMLRPC 문법에 맞
게 XML문서로 변환됩니다.
* Public Boolean responseStatus - 데이터를 보낸 이후, 응답 상태를 나타냅니다. 문제가 있으면 false값
* Public Array responseData - 데이터를 받고, ASP 데이터형태로 변환합니다.
- Methods
* Public void send(url) - XMLRPC 서버쪽으로 데이터를 송신합니다.
= Arguments
* String url - 데이터를 송신할 XMLRPC 서버의 주소를 지정합니다.
3. 예제
아래 예제는... 필자가 구축한 XMLRPC 서버에 데이터를 전송하여, 데이터를 읽어오는 예제입니다.
video.ucc Method로 Argument로 받은 http://www.youtube.com/watch?v=eSnzCpdKXJ8
아래 주소의 UCC 동영상에 대한 정보를 가져오는 부분입니다.
* 전달받은 원시 XMLRPC Response Data
<methodResponse>
<params>
<param>
<value>
<struct>
<member>
<name>subject</name>
<value>
<string>Solitudes: Natural Relaxation - horizons</string>
</value>
</member>
<member>
<name>contents</name>
<value>
<string>Solitudes: Natural Relaxation - horizons ...</string>
</value>
</member>
<member>
<name>tag</name>
<value>
<string>Solitudes Natural Relaxation horizons</string>
</value>
</member>
<member>
<name>flash</name>
<value>
<string>http://www.youtube.com/v/eSnzCpdKXJ8&f=videos&app=youtube_gdata</string>
</value>
</member>
<member>
<name>thumb</name>
<value>
<string>http://i.ytimg.com/vi/eSnzCpdKXJ8/2.jpg</string>
</value>
</member>
<member>
<name>url</name>
<value>
<string>http://www.youtube.com/watch?v=eSnzCpdKXJ8</string>
</value>
</member>
<member>
<name>publisher</name>
<value>
<string>http://youtube.com</string>
</value>
</member>
<member>
<name>category</name>
<value>
<string>Music</string>
</value>
</member>
</struct>
</value>
</param>
</params>
</methodResponse>
* 코드
<!-- #include virtual="/include/class_hashtable.asp" -->
<!-- #include virtual="/include/class_gto.asp" -->
<!-- #include virtual="/include/class_xmlrpc.asp" -->
<%
Dim objRPC
Set objRPC = New xmlRPC
objRPC.method = "video.ucc"
'// 전달할 데이터입니다. 어느 데이터형이라도 가능합니다.
'// Object일 경우는 Scripting.Dictionary 또는 제가 만든 Hashtable (내부적으로는
Scripting.Dictionary ㅠㅠ) 만 가능합니다.
objRPC.data = "http://www.youtube.com/watch?v=eSnzCpdKXJ8"
objRPC.send("http://*******/api/") '// 보안상 ^^;
If objRPC.responseStatus = True Then
'// XMLRPC Response를 받습니다. 보통 수신받는 변수는 한개일 경우가 대부분입니다.
Dim objData : objRPC.responseData(0)
'// 첫번째로 수신받은 데이터는 struct형으로 Hashtable로 변환되지만...
'// Vbscript 문법상 문제때문에... 내부적으로 원소를 하나가진 배열로밖에 표현이 안됩니다.
'// 이해해주세요 ㅠㅠ
Dim curData : Set curData = objData(0)
End If
Set objRPC = Nothing
Dim curKey
For Each curKey In curData.Keys
Response.Write curKey & " - " & curData.Item(curKey) & "<br />"
Next
%>
* 결과
subject - Solitudes: Natural Relaxation - horizons
contents - Solitudes: Natural Relaxation - horizons ...
tag - Solitudes Natural Relaxation horizons
flash - http://www.youtube.com/v/eSnzCpdKXJ8&f=videos&app=youtube_gdata
thumb - http://i.ytimg.com/vi/eSnzCpdKXJ8/2.jpg
url - http://www.youtube.com/watch?v=eSnzCpdKXJ8
publisher - http://youtube.com
category - Music
4. 알려진 버그
VBScript의 문법의 문제상, 바로 변수에 Object (Hashtable 또는 Scripting.Dictionary) 데이터형을
정의하지 못해서 편법으로 0번째 원소를 가진 배열 만드는 방식으로 처리했습니다.
제가 설명을 잘 못해서... 이해하지 못하신 분들은
class_gto.asp 파일을 열어보시길 권합니다 -.-;
설명이 뭐 필요하겠습니까 예제부터 보시죠
예제)
Dim objRS : Set objRS = New GDO
Dim objHash : Set objHash = New Hashtable
objHash.Define "title", "monoless 킹왕짱 미남!!"
Call objRS.ExecuteQuery("update taeyo_board set title=?", objHash)
Set objHash = Nothing
Set objRS = Nothing
예제 2)
Dim objRS : Set objRS = New GDO
Dim objHash : Set objHash = New Hashtable
objHash.Define "title", "monoless 킹왕짱 미남!!"
Dim objData : objData = objRS.OpenQuery("select * from taeyo_board where title=?", objHash)
If IsEmpty(objData) = False Then
Dim curData
For Each curData In objData
Response.Write "Title : " & curData.Item("title") & "<br />"
Response.Write "Name : " & curData.Item("name") & "<br />"
Next
End If
Set objHash = Nothing
Set objRS = Nothing
생성자)
* [void] GDO() - GDO Class를 생성합니다.
Method)
* [void] ExecuteProc(proc, params) - 프로시져를 실행합니다.
- [String] proc - 실행할 프로시져명
- [Object Hashtable] params - 입력할 파라메터
* [void] ExecuteQuery(query, params) - 쿼리를 실행합니다.
- [String] query - 실행할 쿼리
- [Object Hashtable] params - 입력할 파라메터
* [Array] OpenProc(proc, params) - 프로시져를 실행합니다. 결과값은 Object Hashtable을 가진 배열로 반
환합니다.
- [String] proc - 실행할 프로시져명
- [Object Hashtable] params - 입력할 파라메터
* [Array] OpenQuery(query, params) - 쿼리를 실행합니다. 결과값은 Object Hashtable을 가진 배열로 반환
합니다.
- [String] query - 실행할 쿼리
- [Object Hashtable] params - 입력할 파라메터
Property)
* [String] ConnectString - 접속할 DB 연결구문입니다.
Set xh = CreateObject("MSXML2.ServerXMLHTTP")
xh.Open "GET", img_url, false
xh.Send()
imgData = xh.ResponseBody
Set xh = Nothing
Set stm =CreateObject("ADODB.Stream")
stm.open()
stm.type=1
stm.write imgData
stm.SaveToFile 저장경로&저장할이름, 2
stm.close()
Set stm = Nothing
<?php
###############################################################
# Thumbnail Image Generator 1.23
###############################################################
# Visit http://www.zubrag.com/scripts/ for updates
###############################################################
// REQUIREMENTS:
// PHP 4.0.6 and GD 2.0.1 or later
// May not work with GIFs if GD2 library installed on your server
// does not support GIF functions in full
// Parameters:
// src - path to source image
// dest - path to thumb (where to save it)
// x - max width
// y - max height
// q - quality (applicable only to JPG, 1 to 100, 100 - best)
// t - thumb type. "-1" - same as source, 1 = GIF, 2 = JPG, 3 = PNG
// f - save to file (1) or output to browser (0).
// Sample usage:
// 1. save thumb on server
// http://www.zubrag.com/thumb.php?src=test.jpg&dest=thumb.jpg&x=100&y=50
// 2. output thumb to browser
// http://www.zubrag.com/thumb.php?src=test.jpg&x=50&y=50&f=0
// Below are default values (if parameter is not passed)
// save to file (true) or output to browser (false)
$save_to_file = true;
// quality
$image_quality = 100;
// resulting image type (1 = GIF, 2 = JPG, 3 = PNG)
// enter code of the image type if you want override it
// or set it to -1 to determine automatically
$image_type = -1;
// maximum thumb side size
$max_x = 100;
$max_y = 100;
// Folder where source images are stored (thumbnails will be generated from these images).
// MUST end with slash.
//$images_folder = '/home/images/';
// Folder to save thumbnails, full path from the root folder, MUST end with slash.
// Only needed if you save generated thumbnails on the server.
// Sample for windows: c:/wwwroot/thumbs/
// Sample for unix/linux: /home/site.com/htdocs/thumbs/
//$thumbs_folder = '/home/thumbs/';
///////////////////////////////////////////////////
/////////////// DO NOT EDIT BELOW
///////////////////////////////////////////////////
$to_name = '';
if (isset($_REQUEST['f'])) {
$save_to_file = intval($_REQUEST['f']) == 1;
}
if (isset($_REQUEST['src'])) {
$from_name = urldecode($_REQUEST['src']);
}
else {
die("Source file name must be specified.");
}
if (isset($_REQUEST['dest'])) {
$to_name = urldecode($_REQUEST['dest']);
}
else if ($save_to_file) {
die("Thumbnail file name must be specified.");
}
if (isset($_REQUEST['q'])) {
$image_quality = intval($_REQUEST['q']);
}
if (isset($_REQUEST['t'])) {
$image_type = intval($_REQUEST['t']);
}
if (isset($_REQUEST['x'])) {
$max_x = intval($_REQUEST['x']);
}
if (isset($_REQUEST['y'])) {
$max_y = intval($_REQUEST['y']);
}
// Allocate all necessary memory for the image.
// Special thanks to Alecos for providing the code.
ini_set('memory_limit', '-1');
function SaveImage($type, $im, $filename, $quality, $to_file = true) {
$res = null;
// ImageGIF is not included into some GD2 releases, so it might not work
// output png if gifs are not supported
if(!function_exists('imagegif')) $type = 3;
switch ($type) {
case 1:
if ($to_file) {
$res = ImageGIF($im,$filename);
}
else {
header("Content-type: image/gif");
$res = ImageGIF($im);
}
break;
case 2:
if ($to_file) {
$res = ImageJPEG($im,$filename,$quality);
}
else {
header("Content-type: image/jpeg");
$res = ImageJPEG($im,'',$quality);
}
break;
case 3:
if ($to_file) {
$res = ImagePNG($im,$filename);
}
else {
header("Content-type: image/png");
$res = ImagePNG($im,'',$quality);
}
break;
}
return $res;
}
function ImageCreateFromType($type,$filename) {
$im = null;
switch ($type) {
case 1:
$im = ImageCreateFromGif($filename);
break;
case 2:
$im = ImageCreateFromJpeg($filename);
break;
case 3:
$im = ImageCreateFromPNG($filename);
break;
}
return $im;
}
// generate thumb from image and save it
function GenerateThumbFile($from_name, $to_name, $max_x, $max_y) {
global $save_to_file, $image_type, $image_quality;
// if src is URL then download file first
$temp = false;
if (substr($from_name,0,7) == 'http://') {
$tmpfname = tempnam("tmp/", "TmP-");
$temp = @fopen($tmpfname, "w");
if ($temp) {
@fwrite($temp, @file_get_contents($from_name)) or die("Cannot download image");
@fclose($temp);
$from_name = $tmpfname;
}
else {
die("Cannot create temp file");
}
}
// get source image size (width/height/type)
// orig_img_type 1 = GIF, 2 = JPG, 3 = PNG
list($orig_x, $orig_y, $orig_img_type, $img_sizes) = GetImageSize($from_name);
// should we override thumb image type?
$image_type = ($image_type != -1 ? $image_type : $orig_img_type);
// check for allowed image types
if ($orig_img_type < 1 or $orig_img_type > 3) die("Image type not supported");
if ($orig_x > $max_x or $orig_y > $max_y) {
// resize
$per_x = $orig_x / $max_x;
$per_y = $orig_y / $max_y;
if ($per_y > $per_x) {
$max_x = $orig_x / $per_y;
}
else {
$max_y = $orig_y / $per_x;
}
$max_x = $orig_x;
$max_y = $orig_y;
}
else {
// keep original sizes, i.e. just copy
if ($save_to_file) {
@copy($from_name, $to_name);
}
else {
switch ($image_type) {
case 1:
header("Content-type: image/gif");
readfile($from_name);
break;
case 2:
header("Content-type: image/jpeg");
readfile($from_name);
break;
case 3:
header("Content-type: image/png");
readfile($from_name);
break;
}
}
return;
}
if ($image_type == 1) {
// should use this function for gifs (gifs are palette images)
$ni = imagecreate($max_x, $max_y);
}
else {
// Create a new true color image
$ni = ImageCreateTrueColor($max_x,$max_y);
}
// Fill image with white background (255,255,255)
$white = imagecolorallocate($ni, 255, 255, 255);
imagefilledrectangle( $ni, 0, 0, $max_x, $max_y, $white);
// Create a new image from source file
$im = ImageCreateFromType($orig_img_type,$from_name);
// Copy the palette from one image to another
imagepalettecopy($ni,$im);
// Copy and resize part of an image with resampling
imagecopyresampled(
$ni, $im, // destination, source
0, 0, 0, 0, // dstX, dstY, srcX, srcY
$max_x, $max_y, // dstW, dstH
$orig_x, $orig_y); // srcW, srcH
// save thumb file
SaveImage($image_type, $ni, $to_name, $image_quality, $save_to_file);
if($temp) {
unlink($tmpfname); // this removes the file
}
}
// generate
GenerateThumbFile($images_folder . $from_name, $thumbs_folder. $to_name, $max_x, $max_y);
?>
<?
exit;
function remote_image($urlstr){
$url = parse_url($urlstr);
$domain = str_replace("www.","",$url[host]);
$ext = substr($urlstr,strrpos($urlstr,".") + 1);
$string = "";
$res = fsockopen("$domain", 80, $strErrorNo, $strErrStr, 2);
if($res){
$headerstr = "GET $urlstr HTTP/1.1\r\n";
$headerstr.= "Host:$domain:80\r\n";
$headerstr.= "\r\n";
fputs($res, $headerstr);
while (!feof($res)){
$string.= fgets($res, 1024);
}
fclose($res);
}
if($ext == "gif")
return substr($string,strpos($string,"GIF89a"));
elseif($ext == "jpg" || $ext == "jpeg")
return substr($string,strpos($string,"image/jpeg") + 14);
}
function image_save($file,$string){
$fp = @fopen ($file,'w');
if(!$fp) echo $file;
fwrite ($fp,$string);
fclose ($fp);
}
$col[14] = "http://image.gmarket.co.kr/service_image/2007/05/03/Admin_upload200753_165837.GIF";
$file1 = remote_image($col[14]);
if($file1 && strpos($file1,"Not Found") < 1){
$file_name = substr($col[14],strrpos($col[14],"/")+1);
$file_first = substr($file_name,0,strrpos($file_name,"."));
$file_last = substr($file_name,strrpos($file_name,".") + 1);
$file_newname1 = "$file_first" . rand(100,999) . ".$file_last";
image_save("$DOCUMENT_ROOT/a/$file_newname1",$file1);
}
?>
<?
exit;?>
위 함수로 해결 안되는 것이 헤더인데요, 마임타입이라던지 잡다한 놈을 얻기 위해서 소켓을 열어서 헤더를 파싱해서 사용하시는 분이 많더군요(PHP Q&A게시판에서 자주 나온다고 할까나...)
1원짜리 팁은 바로 이것입니다.
$http_response_header
이 넘이 있다는 사실을 지금까진 몰랐는데, 상당히 재미있는 놈이더군요. 일단, PHP에서 미리 정의된 변수로, file_get_contents로 외부 페이지던 동영상이던 읽어오면 위 변수에는 헤더가 저장이 됩니다.
메뉴얼을 링크해놨는데, 뭐 이런 식으로 나온다고 하네요.
<?php
file_get_contents("http://example.com");
var_dump($http_response_header);
?>
array(9) {
[0]=>
string(15) "HTTP/1.1 200 OK"
[1]=>
string(35) "Date: Sat, 12 Apr 2008 17:30:38 GMT"
[2]=>
string(29) "Server: Apache/2.2.3 (CentOS)"
[3]=>
string(44) "Last-Modified: Tue, 15 Nov 2005 13:24:10 GMT"
[4]=>
string(27) "ETag: "280100-1b6-80bfd280""
[5]=>
string(20) "Accept-Ranges: bytes"
[6]=>
string(19) "Content-Length: 438"
[7]=>
string(17) "Connection: close"
[8]=>
string(38) "Content-Type: text/html; charset=UTF-8"
}
전 외부 이미지와 마임타입을 가져오기 위해서 다음과 같이 이용합니다.
$a = file_get_contents($imageUrl);
foreach($http_response_header as $item)
{
if(preg_match('/Content-Type/', $item))
{
$contentType = trim(preg_replace('/.+:/', '', $item));
continue;
}
}
<?
// winamp 방송정보 클래스 정의문서를 포함시키기
include_once("class_cast_info.php");
// winamp 방송정보 객체생성
$castObj = new winamp_cast_info();
// get_info() 메서드에 2번째인자에 1을 넣으면 청취자 관련 정보만 가져옴
$castObj->get_info("www.mukulcast.com");
//$castObj->get_info("sc20.saycast.com:8568",1);
echo "방송제목:", $castObj->info["Title"] , "<br>";
echo "방송장르:" , $castObj->info["Genre"] , "<br>";
echo "방송URL:" , $castObj->info["URL"] , "<br>";
echo "AIM:" , $castObj->info["AIM"] , "<br>";
echo "IRC채널:" , $castObj->info["IRC"] , "<br>";
echo "현재곡:" , $castObj->info["CurrentSong"] , "<br>";
echo "전송속도:" , $castObj->info["Kbps"] ,"<br>";
// 청취자 관련 요소들
echo "청취자수:" , $castObj->info["Listeners"] ,"<br>";
echo "최대청취가능인원:" , $castObj->info["MaxListeners"] , "<br>";
echo "최대청취자수:" , $castObj->info["ListenersPeak"] , "<br>";
echo "평균청취시간:" , $castObj->info["AverageListenTime"] , "<br>";
// get_info() 메서드에 1번째인자 방송주소가 www.mukulcast.com 이런형식이면 설정되는 요소
echo $castObj->real_ip , "<br>";
echo $castObj->real_port , "<br>";
/*
세이케스트는 멀티서버로 되어 있으므로 청취자 인원을 정확히 가져오지 못합니다
만약에 모든서버의 청취자 인원을 원하시면 아래처럼 하시면 됩니다(단! 모든방송서버의 주소를 알아야합니다)
$castObj->get_info("sc20.saycast.com:8001",1);
$total_Listeners += $castObj->info["Listeners"];
$castObj->get_info("sc22.saycast.com:8003",1);
$total_Listeners += $castObj->info["Listeners"];
$castObj->get_info("sc24.saycast.com:8005",1);
$total_Listeners += $castObj->info["Listeners"];
$castObj->get_info("sc25.saycast.com:8007",1);
$total_Listeners += $castObj->info["Listeners"];
echo $total_Listeners;
참고) 위에있는 주소는 설명을하기 위해서 임의로 작성된것입니다
*/
?>
참고용으로 하셔도 되고 실로 써먹어도 되겠지만..
우리나라 웹 현실에 쓸만한게 몇개나 있을까요?
어쨌든 착하게 정리했네요.
/***** 선택자 핵 ******/
/* IE 6 이상 */
* html #uno { color: red }
/* IE 7 이상 */
*:first-child+html #dos { color: red }
/* IE 7 과 현대 브라우저 */
html>body #tres { color: red }
/* 현대 부라우저 (IE 7 빼고) */
html>/**/body #cuatro { color: red }
/* 오페라 9.27 이상 */
html:first-child #cinco { color: red }
/*사파리 */
html[xmlns*=""] body:last-child #seis { color: red }
/*사파리 3+, 크롬 1+, 오페라 9+, 불여우 3.5+ */
body:nth-of-type(1) #siete { color: red }
/* 사파리 3+, 크롬 1+, 오페라 9+, 불여우 3.5+ */
body:first-of-type #ocho { color: red }
/* 사파리 3, 크롬 1+ */
@media screen and (-webkit-min-device-pixel-ratio:0) {
#diez { background: #FFDECE; border: 2px solid #ff0000 }
}
/***** 속성 핵 ******/
/* ie6 이상 */
#once { _color:blue }
/* ie7 이상 */
#doce { *color: blue } /* or #color:blue */
/* '현대 브라우저'는 IE8 을 포함합니다, 여기에 동의하던 말던.. :) */
MP3 태그라 하면 MP3 파일의 마지막에 파일에 관련된 각종 정보를 저장하고 있는 부분을 말합니다. 이러한 태그에 제목 및 가수, 장르 등의 데이터를 정확히 입력, 관리 함으로써 좀더 편리하게 MP3 파일을 관리할 수 있도록 해주며 프로그램에서는 한 개의 태그에 대한 편집 뿐만 아니라 다수의 MP3 파일에 대해 손쉬운 방법으로 태그 편집이 가능합니다.
☞ 주요특징
멀티 파일 및 메뉴얼 태그 편집기
ID3v1 및 ID3v2 MP3 태그 지원
ID3v1를 ID3v2 태그 원 클릭 변환
CSV 추출 마법사
CDDB1 지원
ID3 태그 필드 Swap
M3U 플레이 리스트 생성 지원
외부 기본 재생기를 사용한 MP3 및 VQF 포맷 재생 연동
ISO, BIN을 포함한 대부분의 CD-ROM 이미지 파일들을 처리할 수 있다고 합니다.
셰어웨어로서 비등록 버전에서는 300MB 이상의 이미지 파일을 생성하거나 편집할 수 없습니다.
String.prototype.trim = function() {
return this.replace(/^\s+|\s+$/g,"");
}
String.prototype.ltrim = function() {
return this.replace(/^\s+/,"");
}
String.prototype.rtrim = function() {
return this.replace(/\s+$/,"");
}
경고: 레지스트리 편집기를 잘못 사용하면 심각한 문제가 발생할 수 있으며 문제를 해결하기 위해 운영 체제를 다시 설치해야 할 수도 있습니다. 필자는 레지스트리 편집기를 잘못 사용함으로써 발생하는 문제에 대해 해결을 보증하지 않습니다. 레지스트리 편집기의 사용에 따른 모든 책임은 사용자에게 있습니다.
HKLMSystemCurrentControlSetServicesTcpipParameters
값 이름: SynAttackProtect
키: TcpipParameters
값 종류: REG_DWORD
유효 범위: 0,1
기본값: 0
이 레지스트리 값은 TCP(Transmission Control Protocol)가 SYN-ACKS의 재전송을 조정하도록 합니다. 이 값을 구성하면 SYN 공격(서비스 거부 공격의 한 종류) 동안 연결 응답이 더 빨리 시간 초과됩니다.
다음 매개 변수는 이 레지스트리 값과 함께 사용할 수 있습니다. ? 0(기본값): SYN 공격에 대한 일반적인 보호를 하려면 SynAttackProtect를 0으로 설정합니다.
1 : SYN 공격에 대하여 보다 높은 수준의 보호를 하려면 SynAttackProtect를 1로 설정합니다. 이 매개 변수는 TCP가 SYN-ACKS의 재전송을 조정하도록 합니다. SynAttackProtect를 1로 설정하는 경우 시스템에서 SYN 공격이 이루어지고 있음을 감지하면 연결 응답이 더 빨리 시간 초과됩니다. Windows는 공격이 진행 중인지 확인하기 위하여 다음 값을 사용합니다.
TcpMaxPortsExhausted
TCPMaxHalfOpen
TCPMaxHalfOpenRetried
값 이름: EnableDeadGWDetect
키: TcpipParameters
값 종류: REG_DWORD
유효 범위: 0, 1(False, True)
기본값: 1(True)
다음은 이 레지스트리 값과 함께 사용할 수 있는 매개 변수입니다. ? 1 : EnableDeadGWDetect를 1로 설정하면 TCP는 더 이상 작동하지 않는 게이트웨이를 검색할 수 있습니다. 더 이상 작동하지 않는 게이트웨이 감지가 사용되면 TCP는 여러 연결에 문제가 발생하는 경우 인터넷 프로토콜(IP)에 백업 게이트웨이를 변경하도록 요청할 수 있습니다. 백업 게이트웨이는 제어판의 네트워크 도구에 있는 TCP/IP 구성 대화 상자의 고급 섹션에서 정의됩니다.
0: EnableDeadGWDetect 값은 0으로 설정하는 것이 좋습니다. 0으로 설정하지 않으면 공격으로 인하여 서버가 강제로 원하지 않는 게이트웨이로 전환될 수 있습니다.
값 이름: EnablePMTUDiscovery
키: TcpipParameters
값 종류: REG_DWORD
유효 범위: 0, 1(False, True)
기본값: 1(True)
다음은 이 레지스트리 값과 함께 사용할 수 있는 매개 변수입니다. ? 1 : EnablePMTUDiscovery를 1로 설정하면 TCP는 최대 전송 단위(MTU)나 원격 호스트 경로에 대한 최대 패킷 크기를 검색하려 합니다. TCP는 경로의 MTU를 검색하고 TCP 세그먼트를 이 크기로 제한하여 경로에 있는 각자 다른 MTU로 네트워크에 연결하는 라우터에서 조각을 제거할 수 있습니다. 조각이 있으면 TCP 처리량에 좋지 않은 영향을 줍니다.
? 0 : EnablePMTUDiscovery는 0으로 설정하는 것이 좋습니다. 이렇게 하면 로컬 서브넷에서 호스트하지 않는 모든 연결에 576바이트의 MTU가 사용됩니다. 이 값을 0으로 설정하지 않으면 공격자가 강제로 MTU를 아주 작은 값으로 설정하여 스택의 부하가 커집니다.
값 이름: KeepAliveTime
키: TcpipParameters
값 종류: REG_DWORD - 시간(밀리초)
유효 범위: 1 - 0xFFFFFFFF
기본값: 7,200,000(2시간)
이 값은 TCP가 Keep Alive 패킷을 보내어 유휴 연결이 열려 있는지 확인하는 빈도를 결정합니다. 연결이 유지되어 있다면 원격 컴퓨터가 Keep-Alive 패킷을 인식합니다. Keep-Alive 패킷은 기본적으로 보내지지 않습니다. 연결에서 이 값을 구성하기 위한 프로그램을 사용할 수 있습니다. 권장값은 300,000(5분)입니다.
값 이름: NoNameReleaseOnDemand
키: NetbtParameters
값 종류: REG_DWORD
유효 범위: 0, 1(False, True)
기본값: 0(False)
이 값은 컴퓨터가 이름 해제 요청을 받을 때 NetBIOS 이름을 해제할지 여부를 결정합니다. 이 값은 관리자가 악의적인 이름 해제 공격으로부터 컴퓨터를 보호할 수 있도록 추가되었습니다. NoNameReleaseOnDemand 값은 1로 설정하는 것이 좋습니다.
DisableIPSourceRouting DWORD 2
IP 원본 라우팅은 데이터그램이 네트워크를 통해 취해야 할 IP 경로를 보낸 사람이 결정할 수 있도록 하는 메커니즘입니다.
보안 문제
공격자는 원본에서 라우팅한 패킷을 사용하여 ID와 위치를 모호하게 만들 수 있습니다.
패킷을 보내는 컴퓨터는 원본 라우팅을 통해 사용할 경로를 지정할 수 있습니다.
이 레지스트리 값으로 사용할 수 있는 값은 다음과 같습니다.
? 0, 1 또는 2, 기본값은 0(원본에서 라우팅한 패킷 확인됨)
TcpMaxConnectResponseRetransmissions DWORD 2
TcpMaxConnectResponseRetransmissions: SYN ? ACK retransmissions when a connection request is not acknowledged
이 항목은 SCE에서 MSS: SYN ? ACK retransmissions when a connection request is not acknowledged로 나타납니다. 이 매개 변수는 중단하기 전에 TCP에서 SYN을 재전송하는 횟수를 결정합니다. 재전송 제한 시간은 지정한 연결 시도에서 재전송이 연속될 때마다 두 배로 증가합니다. 초기 시간 제한 값은 3초입니다.
보안 문제
SYN 대규모 공격에서 공격자는 연속 SYN 패킷 스트림을 서버에 보내고 서버는 무력화되어 더 이상 합법적인 요청에 응답할 수 없을 때까지 부분 공개 연결을 열어 둡니다.
대책
MSS: SYN ? ACK retransmissions when a connection request is not acknowledged의 값을 3 seconds, half?open connections dropped after nine seconds로 구성하십시오.
이 레지스트리 값으로 사용할 수 있는 값은 다음과 같습니다.
? 0?0xFFFFFFFF, 기본값은 2
TcpMaxDataRetransmissions DWORD 3
TcpMaxDataRetransmissions: How many times unacknowledged data is retransmitted (3 recommended, 5 is default)
이 항목은 SCE에서 MSS: How many times unacknowledged data is retransmitted (3 recommended, 5 is default)로 나타납니다. 이 매개 변수는 연결을 중단하기 전에 TCP에서 개별 데이터 세그먼트(연결되지 않은 세그먼트)를 재전송하는 횟수를 결정합니다. 재전송 제한 시간은 연결에서 재전송이 연속될 때마다 두 배로 증가하고 응답이 재개되면 다시 설정됩니다. 기본 제한 시간 값은 연결 시 측정된 Round-Trip Time에 따라 동적으로 결정됩니다.
보안 문제
SYN 대규모 공격에서 공격자는 연속 SYN 패킷 스트림을 서버에 보내고 서버는 무력화되어 더 이상 합법적인 요청에 응답할 수 없을 때까지 부분 공개 연결을 열어 둡니다.
대책
MSS: How many times unacknowledged data is retransmitted (3 recommended, 5 is default)의 값을 3으로 구성하십시오. 이 레지스트리 값으로 사용할 수 있는 값은 다음과 같습니다.
? 0 ~ 0xFFFFFFFF, 기본값은 5
PerformRouterDiscovery DWORD 0
PerformRouterDiscovery: Allow IRDP to detect and configure Default Gateway addresses (could lead to DoS)
이 항목은 SCE에서 MSS: Allow IRDP to detect and configure Default Gateway addresses (could lead to DoS)로 나타납니다. 이 설정은 IRDP(Internet Router Discovery Protocol)의 사용 여부를 설정하는 데 사용됩니다. IRDP를 사용하면 시스템에서 기본 게이트웨이 주소를 자동으로 검색하고 구성할 수 있습니다.
보안 문제
같은 네트워크 세그먼트에서 시스템을 제어하는 공격자는 네트워크에서 컴퓨터가 라우터를 가장하도록 구성할 수 있습니다. 그러면 IRDP를 사용하도록 설정된 다른 컴퓨터에서 이미 손상된 시스템을 통해 트래픽을 라우팅하려고 시도할 수 있습니다.
대책
MSS: Allow IRDP to detect and configure Default Gateway addresses (could lead to DoS)의 값을 사용 안 함으로 구성하십시오.
이 레지스트리 값으로 사용할 수 있는 값은 다음과 같습니다.
? 1 또는 0, 기본값은 0(사용 안 함)
TCPMaxPortsExhausted DWORD 5
TCPMaxPortsExhausted: How many dropped connect requests to initiate SYN attack protection (5 is recommended)
이 항목은 SCE에서 MSS: How many dropped connect requests to initiate SYN attack protection (5 is recommended)으로 나타납니다. 이 매개 변수는 SYN ? ATTACK 보호가 작동하기 시작하는 시점을 결정합니다. 사용 가능한 연결 백로그를 0으로 설정했기 때문에 시스템에서 TcpMaxPortsExhausted 연결 요청을 거부하면 SYN ? ATTACK 보호가 작동하기 시작합니다.
보안 문제
SYN 대규모 공격에서 공격자는 연속 SYN 패킷 스트림을 서버에 보내고 서버는 무력화되어 더 이상 합법적인 요청에 응답할 수 없을 때까지 부분 공개 연결을 열어 둡니다.
대책
MSS: How many dropped connect requests to initiate SYN attack protection (5 is recommended)의 값을 5로 구성하십시오.
이 레지스트리 값으로 사용할 수 있는 값은 다음과 같습니다.
? 0 ~ 0xFFFF, 기본값은 5
AFD 설정:
DynamicBacklogGrowthDelta
EnableDynamicBacklog
MinimumDynamicBacklog
MaximumDynamicBacklog
FTP 서버 및 웹 서버와 같은 Windows 소켓 응용 프로그램의 연결 시도는 Afd.sys에 의해 처리됩니다. Afd.sys는 합법적 클라이언트에 대한 액세스를 거부하지 않고 부분 공개 상태에서 여러 번의 연결을 지원하도록 수정되었습니다.
관리자가 동적 백로그를 구성할 수 있도록 함으로써 이러한 지원이 가능해졌습니다.
DynamicBacklogGrowthDelta는 연결이 더 필요할 때 만들 사용 가능 연결 수를 결정합니다. 값이 크면 free 연결 할당이 폭주할 수 있으므로 이 값을 주의하여 설정하십시오.
SYN 대규모 공격에서 공격자는 연속 SYN 패킷 스트림을 서버에 보내고 서버는 무력화되어 더 이상 합법적인 요청에 응답할 수 없을 때까지 부분 공개 연결을 열어 둡니다.
DisableIPSourceRouting
IP 원본 라우팅은 데이터그램이 네트워크를 통해 취해야 할 IP 경로를 보낸 사람이 결정할 수 있도록 하는 메커니즘입니다. 이 값을 2로 설정하면 원본에서 라우팅한 모든 들어오는 패킷이 삭제됩니다.
공격자는 원본에서 라우팅한 패킷을 사용하여 ID와 위치를 모호하게 만듭니다. 패킷을 보내는 컴퓨터는 원본 라우팅을 통해 취할 경로를 지정할 수 있게 됩니다.
PerformRouterDiscovery
이 매개 변수는 IRDP(Internet Router Discovery Protocol)를 지원하는 Windows 2000이 컴퓨터에서 기본 게이트웨이 주소를 자동으로 검색 및 구성하지 못하도록 하기 위해 설정됩니다.
같은 네트워크 세그먼트에서 시스템을 제어하는 공격자는 네트워크에서 컴퓨터가 라우터를 가장하도록 구성할 수 있습니다.
그러면 IRDP를 사용하도록 설정된 다른 컴퓨터에서 이미 손상된 시스템을 통해 트래픽을 라우팅하려고 시도할 수 있습니다.
자동 실행 사용 안 함: 모든 드라이브에 대해 자동 실행 사용 안 함
이 항목은 SCE에서 MSS: 모든 드라이브에 대해 자동 실행 사용 안 함으로 나타납니다. 자동 실행은 컴퓨터의 드라이브에 미디어가 삽입되는 즉시 읽기를 시작하는 기능입니다. 따라서 프로그램의 설치 파일과 오디오 미디어의 사운드가 즉시 시작됩니다.
다음과 같은 레지스트리 값 항목이 템플릿 파일의 HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionPoliciesExplorer 레지스트리 키에 추가되었습니다.
표 5. 자동 실행을 사용하지 않도록 구성하기 위해 레지스트리에 추가된 설정
하위 키 레지스트리 값 항목 형식 권장 값(10진수)
NoDriveTypeAutoRun
DWORD
0xFF
다음 설정의 값을 1로 설정하여 CD/DVD 자동 실행만 사용할 수 없도록 할 수도 있습니다. 다음과 같은 레지스트리 값 항목이 템플릿 파일의 HKEY_LOCAL_MACHINE SYSTEMCurrentControlSetServicesCdrom 레지스트리 키에 추가되었습니다.
표 6. 자동 실행을 사용하지 않도록 구성하기 위해 레지스트리에 추가할 설정
하위 키 레지스트리 값 항목 형식 권장 값(10진수)
AutoRun
DWORD
0
보안 문제
미디어를 삽입할 때 악의적인 프로그램이 시작되지 않도록 하기 위해 그룹 정책을 통해 모든 드라이브에서 자동 실행을 사용하지 않도록 합니다.
시스템에 실제로 액세스할 수 있는 공격자는 자동 실행이 가능한 DVD 또는 CD를 컴퓨터에 삽입할 수 있으므로 이로 인해 악의적인 코드가 자동으로 시작됩니다. 이 악의적 프로그램에는 공격자가 원하는 모든 코드가 포함되어 있습니다.
화면 보호기 암호 보호 즉시 적용: 화면 보호기 유예 기간 만료 시간(초)(0 권장)
이 항목은 SCE에서 MSS: 화면 보호기 유예 기간 만료 시간(초)(0 권장)으로 나타납니다. Windows에는 화면 보호기 잠금이 활성화되어 있는 경우 화면 보호기가 실행된 후 실제로 콘솔이 자동으로 잠길 때까지의 유예 기간이 설정되어 있습니다.
다음과 같은 레지스트리 값 항목이 템플릿 파일의 HKEY_LOCAL_MACHINESYSTEMSoftwareMicrosoftWindows NTCurrentVersionWinlogon 레지스트리 키에 추가되었습니다.
표 7. 화면 보호기 암호 보호를 즉시 적용하기 위해 레지스트리에 추가된 설정
하위 키 레지스트리 값 항목 형식 권장 값(10진수)
ScreenSaverGracePeriod
String
0
보안 문제
화면 보호기 잠금이 실행되기 전에 사용자 동작에 허용된 기본 유예 기간은 5초입니다. 기본 유예 기간의 기본 설정을 그대로 유지하면 화면 보호기 잠금이 실행되기 전에 시스템에 로그온하기 위해 콘솔에 들어가는 사람으로부터 컴퓨터가 쉽게 공격을 받을 수 있습니다. 레지스트리 항목을 만들어 유예 기간을 조정할 수 있습니다.
대책
MSS: 화면 보호기 유예 기간 만료 시간(초)(0 권장)의 값을 0으로 구성하십시오.
이 레지스트리 값으로 사용할 수 있는 값은 다음과 같습니다.
? 0 ~ 255, 기본값은 5초
보안 로그 용량 경고: 시스템에서 경고를 생성할 보안 이벤트 로그 용량에 대한 백분율 임계값
이 항목은 SCE에서 MSS: 시스템에서 경고를 생성할 보안 이벤트 로그 용량에 대한 백분율 임계값으로 나타납니다. Windows Server 2003과 Windows 2000 서비스 팩 3에는 보안 로그가 사용자 정의된 임계값에 도달하면 보안 이벤트 로그에 보안 감사를 생성하는 새로운 기능이 포함되어 있습니다. 예를 들어 이 값이 90으로 설정된 경우에는 보안 로그가 용량의 90%에 도달하면 eventID 523에 대한 이벤트 항목과 보안 이벤트 로그가 90% 찼습니다.라는 텍스트가 표시됩니다.
참고: 필요에 따라 이벤트를 덮어쓰도록 보안 이벤트 로그를 구성한 경우에는 이 설정이 적용되지 않습니다.
다음과 같은 레지스트리 값 항목이 템플릿 파일의 HKEY_LOCAL_MACHINE SYSTEMCurrentControlSetServicesEventlogSecurity 레지스트리 키에 추가되었습니다.
표 8. 안전한 DLL 검색 모드를 사용할 수 있도록 레지스트리에 추가된 설정
하위 키 레지스트리 값 항목 형식 권장 값(10진수)
WarningLevel
DWORD
0
보안 문제
필요에 따라 이벤트를 덮어쓰도록 컴퓨터를 구성하지 않은 경우 보안 로그가 꽉 차면 최신 이벤트가 로그에 기록되지 않습니다. 보안 로그에 더 이상 이벤트를 기록할 수 없을 때 컴퓨터를 종료하도록 구성한 경우 로그가 꽉 차면 컴퓨터가 종료되고 네트워크 서비스를 더 이상 제공할 수 없게 됩니다.
대책
MSS: 시스템에서 경고를 생성할 보안 이벤트 로그 용량에 대한 백분율 임계값의 값을 90으로 구성하십시오.
이 레지스트리 값으로 사용할 수 있는 값은 다음과 같습니다.
? 0 ~ 100, 기본값은 0(경고 이벤트가 생성되지 않음)
안전한 DLL 검색 순서 사용: 안전한 DLL 검색 모드 사용(권장)
이 항목은 SCE에서 MSS: 안전한 DLL 검색 모드 사용(권장)으로 나타납니다. 다음 두 가지 중 한 가지 방법으로 프로세스를 실행하여 요청된 DLL(동적 연결 라이브러리)을 검색하도록 DLL 검색 순서를 구성할 수 있습니다.
? 시스템 경로에 지정된 폴더를 먼저 검색한 다음 현재 작업 중인 폴더를 검색합니다.
? 현재 작업 중인 폴더를 먼저 검색한 다음 시스템 경로에 지정된 폴더를 검색합니다.
이 레지스트리 값은 1로 설정되어 있습니다. 이 경우 시스템에서는 시스템 경로에 지정된 폴더를 먼저 검색한 다음 현재 작업 중인 폴더를 검색합니다. 0으로 설정하면 시스템에서는 현재 작업 중인 폴더를 먼저 검색한 다음 시스템 경로에 지정된 폴더를 검색합니다.
다음과 같은 레지스트리 값 항목이 템플릿 파일의 HKEY_LOCAL_MACHINE SYSTEMCurrentControlSetControlSession Manager 레지스트리 키에 추가되었습니다.
표 9. 안전한 DLL 검색 모드를 사용할 수 있도록 레지스트리에 추가된 설정
하위 키 레지스트리 값 항목 형식 권장 값(10진수)
SafeDllSearchMode
DWORD
0
보안 문제
사용자가 실수로 악성 코드를 실행하는 경우 이 코드가 수정된 버전의 시스템 DLL을 포함하여 추가 파일과 함께 패키지되어 있으면 해당 DLL의 고유 버전이 로드되어 코드에서 렌더링할 수 있는 손상 유형 및 정도가 커집니다.
대책
MSS: 안전한 DLL 검색 모드 사용(권장)의 값을 사용으로 구성하십시오.
이 레지스트리 값으로 사용할 수 있는 값은 다음과 같습니다.
? 1 또는 0, 기본값은 0
최종 로그온 사용자 이름 감추기
레지스트리를 아래와 같이 설정하여 최종 로그온 한 사용자의 이름을 감추십시오.
Win NT
하이브
HKEY_LOCAL_MACHINESOFTWARE
키
MicrosoftWindows NTCurrent VersionWinlogon
이름
DontDisplayLastUserName
형식
REG_SZ (Win 2000 > REG_DWORD)
값
1
win NT
공개 로컬 보안 인증(LSA)의 정보에 대한 액세스 제한
시스템의 모든 사용자를 식별하여, 익명 사용자를 제한하고 Windows NT Security Subsystem의 LSA 구성 요소에 대해 얻을 수 있는 공개 정보를 최소화해야 합니다. LSA는 로컬 컴퓨터의 액세스와 사용 권한을 포함한 보안 관리 항목을 처리합니다. 이 제한을 적용하려면 아래와 같이 레지스트리 항목을 만들고 설정하십시오. 하이브
HKEY_LOCAL_MACHINE SYSTEM
키
CurrentControlSetControlLSA
값 이름
RestrictAnonymous
종류
REG_DWORD
값
1
win 2000
RestrictAnonymous 레지스트리 값
레지스트리 편집기를 사용하여 다음 레지스트리 키를 보고 이 키에 다음 값을 추가하거나 값이 이미 있는 경우 값을 수정하십시오.
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlLSA
값: RestrictAnonymous
값 종류: REG_DWORD
값 데이터: 0x2(16진수)
윈도우 기본 공유 폴더 생성 또는 제거
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesLanmanServerParametersAutoShareServer
AutoShareServer의 값을 0으로 한경우 재시작시 공유 만들지 않음.
1인경우 재시작시 공유 만들거나 복원.
출처 : [기타] 인터넷 : support.microsoft.com 검색 내용
--//Description: T-SQL script to generate the database document for SQL server 2000/2005
Declare @i Int, @maxi Int
Declare @j Int, @maxj Int
Declare @sr int
Declare @Output varchar(4000)
--Declare @tmpOutput varchar(max)
Declare @SqlVersion varchar(5)
Declare @last varchar(155), @current varchar(255), @typ varchar(255), @description varchar(4000)
create Table #Tables (id int identity(1, 1), Object_id int, Name varchar(155), Type varchar(20), [description] varchar(4000))
create Table #Columns (id int identity(1,1), Name varchar(155), Type Varchar(155), Nullable varchar(2), [description] varchar(4000))
create Table #Fk(id int identity(1,1), Name varchar(155), col Varchar(155), refObj varchar(155), refCol varchar(155))
create Table #Constraint(id int identity(1,1), Name varchar(155), col Varchar(155), definition varchar(1000))
create Table #Indexes(id int identity(1,1), Name varchar(155), Type Varchar(25), cols varchar(1000))
If (substring(@@VERSION, 1, 25 ) = 'Microsoft SQL Server 2005')
set @SqlVersion = '2005'
else if (substring(@@VERSION, 1, 26 ) = 'Microsoft SQL Server 2000')
set @SqlVersion = '2000'
else
set @SqlVersion = '2005'
Print '<head>'
Print '<title>::' + DB_name() + '::</title>'
Print '<style>'
Print ' body {'
Print ' font-family:verdana;'
Print ' font-size:9pt;'
Print ' }'
Print ' td {'
Print ' font-family:verdana;'
Print ' font-size:9pt;'
Print ' }'
Print ' th {'
Print ' font-family:verdana;'
Print ' font-size:9pt;'
Print ' background:#d3d3d3;'
Print ' }'
Print ' table'
Print ' {'
Print ' background:#d3d3d3;'
Print ' }'
Print ' tr'
Print ' {'
Print ' background:#ffffff;'
Print ' }'
Print ' </style>'
Print '</head>'
Print '<body>'
set nocount on
if @SqlVersion = '2000'
begin
insert into #Tables (Object_id, Name, Type, [description])
--FOR 2000
select object_id(table_name), '[' + table_schema + '].[' + table_name + ']',
case when table_type = 'BASE TABLE' then 'Table' else 'View' end,
cast(p.value as varchar(4000))
from information_schema.tables t
left outer join sysproperties p on p.id = object_id(t.table_name) and smallid = 0 and p.name = 'MS_Description'
order by table_type, table_schema, table_name
end
else if @SqlVersion = '2005'
begin
insert into #Tables (Object_id, Name, Type, [description])
--FOR 2005
Select o.object_id, '[' + s.name + '].[' + o.name + ']',
case when type = 'V' then 'View' when type = 'U' then 'Table' end,
cast(p.value as varchar(4000))
from sys.objects o
left outer join sys.schemas s on s.schema_id = o.schema_id
left outer join sys.extended_properties p on p.major_id = o.object_id and minor_id = 0 and p.name = 'MS_Description'
where type in ('U', 'V')
order by type, s.name, o.name
end
Set @maxi = @@rowcount
set @i = 1
print '<table border="0" cellspacing="0" cellpadding="0" width="550px" align="center"><tr><td colspan="3" style="height:50;font-size:14pt;text-align:center;"><a name="index"></a><b>Index</b></td></tr></table>'
print '<table border="0" cellspacing="1" cellpadding="0" width="550px" align="center"><tr><th>Sr</th><th>Object</th><th>Type</th></tr>'
While(@i <= @maxi)
begin
select @Output = '<tr><td align="center">' + Cast((@i) as varchar) + '</td><td><a href="#' + Type + ':' + name + '">' + name + '</a></td><td>' + Type + '</td></tr>'
from #Tables where id = @i
print @Output
set @i = @i + 1
end
print '</table><br />'
set @i = 1
While(@i <= @maxi)
begin
--table header
select @Output = '<tr><th align="left"><a name="' + Type + ':' + name + '"></a><b>' + Type + ':' + name + '</b></th></tr>', @description = [description]
from #Tables where id = @i
print '<br /><br /><br /><table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td align="right"><a href="#index">Index</a></td></tr>'
print @Output
print '</table><br />'
print '<table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td><b>Description</b></td></tr><tr><td>' + isnull(@description, '') + '</td></tr></table><br />'
--table columns
truncate table #Columns
if @SqlVersion = '2000'
begin
insert into #Columns (Name, Type, Nullable, [description])
--FOR 2000
Select c.name,
type_name(xtype) + (
case when (type_name(xtype) = 'varchar' or type_name(xtype) = 'nvarchar' or type_name(xtype) ='char' or type_name(xtype) ='nchar')
then '(' + cast(length as varchar) + ')'
when type_name(xtype) = 'decimal'
then '(' + cast(prec as varchar) + ',' + cast(scale as varchar) + ')'
else ''
end
),
case when isnullable = 1 then 'Y' else 'N' end,
cast(p.value as varchar(8000))
from syscolumns c
inner join #Tables t on t.object_id = c.id
left outer join sysproperties p on p.id = c.id and p.smallid = c.colid and p.name = 'MS_Description'
where t.id = @i
order by c.colorder
end
else if @SqlVersion = '2005'
begin
insert into #Columns (Name, Type, Nullable, [description])
--FOR 2005
Select c.name,
type_name(user_type_id) + (
case when (type_name(user_type_id) = 'varchar' or type_name(user_type_id) = 'nvarchar' or type_name(user_type_id) ='char' or type_name(user_type_id) ='nchar')
then '(' + cast(max_length as varchar) + ')'
when type_name(user_type_id) = 'decimal'
then '(' + cast([precision] as varchar) + ',' + cast(scale as varchar) + ')'
else ''
end
),
case when is_nullable = 1 then 'Y' else 'N' end,
cast(p.value as varchar(4000))
from sys.columns c
inner join #Tables t on t.object_id = c.object_id
left outer join sys.extended_properties p on p.major_id = c.object_id and p.minor_id = c.column_id and p.name = 'MS_Description'
where t.id = @i
order by c.column_id
end
Set @maxj = @@rowcount
set @j = 1
print '<table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td><b>Table Columns</b></td></tr></table>'
print '<table border="0" cellspacing="1" cellpadding="0" width="750px"><tr><th>Sr.</th><th>Name</th><th>Datatype</th><th>Nullable</th><th>Description</th></tr>'
While(@j <= @maxj)
begin
select @Output = '<tr><td width="20px" align="center">' + Cast((@j) as varchar) + '</td><td width="150px">' + isnull(name,'') + '</td><td width="150px">' + upper(isnull(Type,'')) + '</td><td width="50px" align="center">' + isnull(Nullable,'N') + '</td><td>' + isnull([description],'') + '</td></tr>'
from #Columns where id = @j
print @Output
Set @j = @j + 1;
end
print '</table><br />'
--reference key
truncate table #FK
if @SqlVersion = '2000'
begin
insert into #FK (Name, col, refObj, refCol)
-- FOR 2000
select object_name(constid), s.name, object_name(rkeyid) , s1.name
from sysforeignkeys f
inner join sysobjects o on o.id = f.constid
inner join syscolumns s on s.id = f.fkeyid and s.colorder = f.fkey
inner join syscolumns s1 on s1.id = f.rkeyid and s1.colorder = f.rkey
inner join #Tables t on t.object_id = f.fkeyid
where t.id = @i
order by 1
end
else if @SqlVersion = '2005'
begin
insert into #FK (Name, col, refObj, refCol)
-- FOR 2005
select f.name, COL_NAME (fc.parent_object_id, fc.parent_column_id) , object_name(fc.referenced_object_id) , COL_NAME (fc.referenced_object_id, fc.referenced_column_id)
from sys.foreign_keys f
inner join sys.foreign_key_columns fc on f.object_id = fc.constraint_object_id
inner join #Tables t on t.object_id = f.parent_object_id
where t.id = @i
order by f.name
end
Set @maxj = @@rowcount
set @j = 1
if (@maxj >0)
begin
print '<table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td><b>Refrence Keys</b></td></tr></table>'
print '<table border="0" cellspacing="1" cellpadding="0" width="750px"><tr><th>Sr.</th><th>Name</th><th>Column</th><th>Reference To</th></tr>'
While(@j <= @maxj)
begin
select @Output = '<tr><td width="20px" align="center">' + Cast((@j) as varchar) + '</td><td width="150px">' + isnull(name,'') + '</td><td width="150px">' + isnull(col,'') + '</td><td>[' + isnull(refObj,'N') + '].[' + isnull(refCol,'N') + ']</td></tr>'
from #FK where id = @j
print @Output
Set @j = @j + 1;
end
print '</table><br />'
end
--Default Constraints
truncate table #Constraint
if @SqlVersion = '2000'
begin
insert into #Constraint (Name, col, definition)
select object_name(c.constid), col_name(c.id, c.colid), s.text
from sysconstraints c
inner join #Tables t on t.object_id = c.id
left outer join syscomments s on s.id = c.constid
where t.id = @i
and
convert(varchar,+ (c.status & 1)/1)
+ convert(varchar,(c.status & 2)/2)
+ convert(varchar,(c.status & 4)/4)
+ convert(varchar,(c.status & 8)/8)
+ convert(varchar,(c.status & 16)/16)
+ convert(varchar,(c.status & 32)/32)
+ convert(varchar,(c.status & 64)/64)
+ convert(varchar,(c.status & 128)/128) = '10101000'
end
else if @SqlVersion = '2005'
begin
insert into #Constraint (Name, col, definition)
select c.name, col_name(parent_object_id, parent_column_id), c.definition
from sys.default_constraints c
inner join #Tables t on t.object_id = c.parent_object_id
where t.id = @i
order by c.name
end
Set @maxj = @@rowcount
set @j = 1
if (@maxj >0)
begin
print '<table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td><b>Default Constraints</b></td></tr></table>'
print '<table border="0" cellspacing="1" cellpadding="0" width="750px"><tr><th>Sr.</th><th>Name</th><th>Column</th><th>Value</th></tr>'
While(@j <= @maxj)
begin
select @Output = '<tr><td width="20px" align="center">' + Cast((@j) as varchar) + '</td><td width="250px">' + isnull(name,'') + '</td><td width="150px">' + isnull(col,'') + '</td><td>' + isnull(definition,'') + '</td></tr>'
from #Constraint where id = @j
print @Output
Set @j = @j + 1;
end
print '</table><br />'
end
--Check Constraints
truncate table #Constraint
if @SqlVersion = '2000'
begin
insert into #Constraint (Name, col, definition)
select object_name(c.constid), col_name(c.id, c.colid), s.text
from sysconstraints c
inner join #Tables t on t.object_id = c.id
left outer join syscomments s on s.id = c.constid
where t.id = @i
and ( convert(varchar,+ (c.status & 1)/1)
+ convert(varchar,(c.status & 2)/2)
+ convert(varchar,(c.status & 4)/4)
+ convert(varchar,(c.status & 8)/8)
+ convert(varchar,(c.status & 16)/16)
+ convert(varchar,(c.status & 32)/32)
+ convert(varchar,(c.status & 64)/64)
+ convert(varchar,(c.status & 128)/128) = '00101000'
or convert(varchar,+ (c.status & 1)/1)
+ convert(varchar,(c.status & 2)/2)
+ convert(varchar,(c.status & 4)/4)
+ convert(varchar,(c.status & 8)/8)
+ convert(varchar,(c.status & 16)/16)
+ convert(varchar,(c.status & 32)/32)
+ convert(varchar,(c.status & 64)/64)
+ convert(varchar,(c.status & 128)/128) = '00100100')
end
else if @SqlVersion = '2005'
begin
insert into #Constraint (Name, col, definition)
select c.name, col_name(parent_object_id, parent_column_id), definition
from sys.check_constraints c
inner join #Tables t on t.object_id = c.parent_object_id
where t.id = @i
order by c.name
end
Set @maxj = @@rowcount
set @j = 1
if (@maxj >0)
begin
print '<table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td><b>Check Constraints</b></td></tr></table>'
print '<table border="0" cellspacing="1" cellpadding="0" width="750px"><tr><th>Sr.</th><th>Name</th><th>Column</th><th>Definition</th></tr>'
While(@j <= @maxj)
begin
select @Output = '<tr><td width="20px" align="center">' + Cast((@j) as varchar) + '</td><td width="250px">' + isnull(name,'') + '</td><td width="150px">' + isnull(col,'') + '</td><td>' + isnull(definition,'') + '</td></tr>'
from #Constraint where id = @j
print @Output
Set @j = @j + 1;
end
print '</table><br />'
end
--Triggers
truncate table #Constraint
if @SqlVersion = '2000'
begin
insert into #Constraint (Name)
select tr.name
FROM sysobjects tr
inner join #Tables t on t.object_id = tr.parent_obj
where t.id = @i and tr.type = 'TR'
order by tr.name
end
else if @SqlVersion = '2005'
begin
insert into #Constraint (Name)
SELECT tr.name
FROM sys.triggers tr
inner join #Tables t on t.object_id = tr.parent_id
where t.id = @i
order by tr.name
end
Set @maxj = @@rowcount
set @j = 1
if (@maxj >0)
begin
print '<table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td><b>Triggers</b></td></tr></table>'
print '<table border="0" cellspacing="1" cellpadding="0" width="750px"><tr><th>Sr.</th><th>Name</th><th>Description</th></tr>'
While(@j <= @maxj)
begin
select @Output = '<tr><td width="20px" align="center">' + Cast((@j) as varchar) + '</td><td width="150px">' + isnull(name,'') + '</td><td></td></tr>'
from #Constraint where id = @j
print @Output
Set @j = @j + 1;
end
print '</table><br />'
end
--Indexes
truncate table #Indexes
if @SqlVersion = '2000'
begin
insert into #Indexes (Name, type, cols)
select i.name, case when i.indid = 0 then 'Heap' when i.indid = 1 then 'Clustered' else 'Nonclustered' end , c.name
from sysindexes i
inner join sysindexkeys k on k.indid = i.indid and k.id = i.id
inner join syscolumns c on c.id = k.id and c.colorder = k.colid
inner join #Tables t on t.object_id = i.id
where t.id = @i and i.name not like '_WA%'
order by i.name, i.keycnt
end
else if @SqlVersion = '2005'
begin
insert into #Indexes (Name, type, cols)
select i.name, case when i.type = 0 then 'Heap' when i.type = 1 then 'Clustered' else 'Nonclustered' end, col_name(i.object_id, c.column_id)
from sys.indexes i
inner join sys.index_columns c on i.index_id = c.index_id and c.object_id = i.object_id
inner join #Tables t on t.object_id = i.object_id
where t.id = @i
order by i.name, c.column_id
end
Set @maxj = @@rowcount
set @j = 1
set @sr = 1
if (@maxj >0)
begin
print '<table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td><b>Indexes</b></td></tr></table>'
print '<table border="0" cellspacing="1" cellpadding="0" width="750px"><tr><th>Sr.</th><th>Name</th><th>Type</th><th>Columns</th></tr>'
set @Output = ''
set @last = ''
set @current = ''
While(@j <= @maxj)
begin
select @current = isnull(name,'') from #Indexes where id = @j
if @last <> @current and @last <> ''
begin
print '<tr><td width="20px" align="center">' + Cast((@sr) as varchar) + '</td><td width="150px">' + @last + '</td><td width="150px">' + @typ + '</td><td>' + @Output + '</td></tr>'
set @Output = ''
set @sr = @sr + 1
end
select @Output = @Output + cols + '<br />' , @typ = type
from #Indexes where id = @j
set @last = @current
Set @j = @j + 1;
end
if @Output <> ''
begin
print '<tr><td width="20px" align="center">' + Cast((@sr) as varchar) + '</td><td width="150px">' + @last + '</td><td width="150px">' + @typ + '</td><td>' + @Output + '</td></tr>'
end
print '</table><br />'
end
Set @i = @i + 1;
--Print @Output
end
Print '</body>'
Print '</html>'
drop table #Tables
drop table #Columns
drop table #FK
drop table #Constraint
drop table #Indexes
set nocount off
2001년도쯤에 작성한걸로 기억하는 코드인데 괴상한 목적으로 사용하지 않는게 좋고 관리를 목적으로 사용하려면 security validation정도는 해주시는 센스필요하구요. 잘 응용하고 파일전송을 안정적으로 할 수 있는 application을 개발하시면 웹하드 용도로도 괜찮을 것 같은데. 그냥 생각일 뿐입니다.
<%@ language=vbscript %>
<%
option explicit
On Error Resume Next
dim command
command = request.querystring("command")
select case command
case "drives"
call drivelist
case "folders"
call folderlist
case "viewfile"
call viewfile
case "downfile"
call downfile
case "delfile"
call delFile
case "editfile"
call editFile
case "upload"
call upload
case "copyfile"
call copyfile
case "movefile"
call movefile
case "pastefile"
call pastefile
case "dumplist"
call dumplist
case else
call drivelist
end select
if err.description <> "" then
response.clear
response.write "<script language=javascript> alert (""" & err.description & """); history.back();</script>"
err.clear
end if
Function CalcByte(xspace)
If xspace < 1024 Then
CalcByte = xspace
ElseIf xspace >= 1024 And xspace < 1048576 Then
CalcByte = FormatNumber((xspace / 1024),2) & " K"
ElseIf xspace >= 1048576 And xspace < 1073741824 Then
CalcByte = FormatNumber((xspace / 1048576),2) & " M"
ElseIf xspace >= 1073741824 then
CalcByte = FormatNumber((xspace/1073741824),2) & "G"
End If
End Function
Function FileAttributes(intAttribute)
select case intAttribute
case 0
FileAttributes = "Normal"
case 1
FileAttributes = "Read Only"
case 2
FileAttributes = "Hidden"
case 4
FileAttributes = "System"
case 16
FileAttributes = "Directory"
case 32
FileAttributes = "Archive"
case 1024
FileAttributes = "Alias"
case 2048
FileAttributes = "Compressed"
case else
FileAttributes = intAttribute
end select
End Function
Function xLeft(strTemp, intPoint)
if Len(strTemp) <= intPoint then
xLeft = strTemp
else
xLeft = mid(strTemp,1, intPoint) & "..."
end if
End Function
Function FileExists(strFilename)
Dim FSO
Set FSO = server.createobject("Scripting.FileSystemObject")
FileExists = FSO.FileExists(strFilename)
Set FSO = Nothing
End Function
Sub goBack(Msg)
response.clear
response.write "<html><body><form action=""" & request.servervariables("HTTP_REFERER") & """ method=post name=form1></form>"
response.write "<script language=javascript>"
if Msg <> "" then
response.write " alert (""" & Msg & """);"
end if
response.write " document.form1.submit();</script>"
response.write "</body></html>"
if err.description = "" then
response.end
end if
End Sub
Sub drivelist
dim fso
dim objDrive
dim drivetype(5)
dim strDriveTypeImg
dim strDriveLetter
dim strDriveName
dim intFreeSpace
dim intTotalSpace
drivetype(0) = "알 수 없음"
drivetype(1) = "<img src=""images/drivetype1.jpg"">"
drivetype(2) = "<img src=""images/drivetype2.jpg"">"
drivetype(3) = "<img src=""images/drivetype3.jpg"">"
drivetype(4) = "<img src=""images/drivetype4.jpg"">"
drivetype(5) = "RAM"
set fso = server.createobject("scripting.filesystemobject")
response.write "<table border=0 cellpadding=5 cellspacing=1 bgcolor=black align=center width=95% >"
response.write "<tr bgcolor=#eeeeee align=center><td>종류</td><td>드라이브 이름</td><td>공간(빈/총)</td></tr>"
for each objDrive in fso.drives
strDriveTypeImg = drivetype(objDrive.drivetype)
strDriveLetter = objDrive
if objDrive.drivetype = 3 then
if objDrive.isReady then
strDriveName = objDrive.ShareName
intFreeSpace = objDrive.FreeSpace
intTotalSpace = objDrive.TotalSize
else
strDriveName = "연결안됨"
intFreeSpace = 0
intTotalSpace = 0
end if
else
if objDrive.isReady then
strDriveName = objDrive.VolumeName
intFreeSpace = objDrive.FreeSpace
intTotalSpace = objDrive.TotalSize
else
strDriveName = "비어있음"
intFreeSpace = 0
intTotalSpace = 0
end if
end if
response.write "<tr bgcolor=white><td align=center>" & strDriveTypeImg & "</td><td align=center>"
if objDrive.isReady then
response.write "<a href=""?command=folders&folder=" & server.urlencode(strDriveLetter) & """>"
end if
response.write strDriveName & " (" & strDriveLetter & ")"
if objDrive.isReady then
response.write "</a>"
end if
response.write "</td><td>" & CalcByte(intFreeSpace) & " / " & CalcByte(intTotalSpace) & "</td></tr>"
next
response.write "</table>"
set fso = nothing
end sub
sub folderlist
dim fso
dim objFolder
dim objSubFolder
dim objFile
dim strName
dim intSize
dim strSort
dim strEditDate
dim strFolder
strFolder = request("folder")
response.write "<table border=0 cellpadding=5 cellspacing=0 align=center width=95% >"
response.write "<tr><td><img src=""images/move.jpg"" border=0 alt=""잘라내기"" style=""cursor:hand;"" onclick=""javascript:document.explorer.action='?command=movefile';document.explorer.submit();""> <img src=""images/copy.jpg"" border=0 alt=""복사"" style=""cursor:hand;"" onclick=""javascript:document.explorer.action='?command=copyfile';document.explorer.submit();""> <img src=""images/paste.jpg"" border=0 alt=""붙여넣기"""
if request.cookies("webexplorer")("filelist") <> "" then
response.write " style=""cursor:hand;"" onclick=""javascript:document.explorer.action='?command=pastefile&folder=" & server.urlencode(strFolder) & "';document.explorer.submit();"""
end if
response.write "> <img src=""images/del.jpg"" border=0 alt=""삭제"" style=""cursor:hand;"" onclick=""javascript:document.explorer.action='?command=delfile';document.explorer.submit();""> <img src=""images/viewfile.jpg"" border=0 alt=""대기작업보기"""
if request.cookies("webexplorer")("filelist") <> "" then
response.write " style=""cursor:hand;"" onclick=""javascript:document.explorer.action='?command=dumplist';document.explorer.submit();"""
end if
response.write "></td></tr>"
response.write"<tr><td align=center><form action=""?command=upload"" name=frmupload method=post enctype=multipart/form-data><input type=file name=ufile> <input type=hidden name=folder value=""" & strFolder & """><input type=button value=""파일올리기"" onclick=""uploadform()""></form></td></tr>"
response.write "</table>" & vbcrlf
response.write "<script language=""javascript"">" & vbcrlf
response.write "function uploadform()" & vbcrlf
response.write "{" & vbcrlf
response.write "if (document.frmupload.ufile.value == """") " & vbcrlf
response.write " {" & vbcrlf
response.write " alert (""업로드할 파일을 선택해주십시요."");" & vbcrlf
response.write " return false;" & vbcrlf
response.write " }" & vbcrlf
response.write "document.frmupload.submit();" & vbcrlf
response.write "}" & vbcrlf
response.write "</script>" & vbcrlf
response.write "<form name=explorer method=post>"
response.write "<table border=0 cellpadding=5 cellspacing=1 bgcolor=black align=center width=95% >"
response.write "<tr bgcolor=#eeeeee align=center><td> </td><td> </td><td>이름</td><td>크기</td><td>종류</td><td>수정된 날짜</td></tr>"
set fso = server.createobject("scripting.filesystemobject")
set objFolder = fso.getfolder( strFolder & "\")
if objFolder.IsRootFolder then
response.write "<tr bgcolor=white><td> </td><td align=center><img src=""images/filefolder.jpg""></td><td><a href=""?command=drives"">..</a></td><td> </td><td> </td><td> </td></tr>"
else
response.write "<tr bgcolor=white><td> </td><td align=center><img src=""images/filefolder.jpg""></td><td><a href=""?command=folders&folder=" & server.urlencode(objFolder.ParentFolder) & """>..</a></td><td> </td><td> </td><td> </td></tr>"
end if
for each objSubFolder in objFolder.subfolders
strName = objSubFolder.Name
strSort = objSubFolder.Type
strEditDate = objSubFolder.DateLastModified
response.write "<tr bgcolor=white><td><input type=checkbox name=""" & objSubFolder & """></td><td align=center><img src=""images/filefolder.jpg""></td><td><a href=""?command=folders&folder=" & server.urlencode(objSubFolder) & """>" & strName & "</a></td><td> </td><td>" & xLeft(strSort,5) & "</td><td>" & mid(strEditDate,1,10) & "</td></tr>"
next
set objSubFolder = nothing
for each objFile in objFolder.files
strName = objFile.Name
intSize = objFile.Size
strSort = objFile.Type
strEditDate = objFile.DateLastModified
response.write "<tr bgcolor=white><td><input type=checkbox name=""" & objFile & """></td><td align=center><a href=""?command=downfile&file=" & server.urlencode(objFile) & """><img src=""images/unknownfiletype.jpg"" border=0></a></td><td><a href=""?command=viewfile&file=" & server.urlencode(objFile) & """>" & strName & "</a></td><td align=right>" & CalcByte(intSize) & "</td><td>" & xLeft(strSort,5) & "</td><td>" & mid(strEditDate,1,10) & "</td></tr>"
next
set objFile = nothing
set objFolder = nothing
set fso = nothing
response.write "</table>"
response.write "</form>"
end sub
Sub downFile()
Dim DownFileName
Dim xDownFileName
Dim fso
Dim file
DownFileName = Request("file")
If Not FileExists(DownFileName) Then
Err.Raise 3, "한머리의 조언", "해당 파일이 존재하지 않습니다."
Exit Sub
End If
Response.Clear
Response.Buffer = true
Response.Expires = 0
Response.ExpiresAbsolute = Now() - 1
Response.AddHeader "pragma", "no-cache"
Response.AddHeader "cache-control", "private"
Response.CacheControl = "no-cache"
xDownFileName = Mid(DownFileName, InStrRev(DownFileName, "\") + 1, Len(DownFileName) - InStrRev(DownFileName, "\"))
Response.clear
Response.AddHeader "Content-Disposition", " inline; filename=" & xDownFileName & ";"
Response.ContentType = "application/unknown"
set fso = server.CreateObject("SiteGalaxyUpload.FileSystemObject")
set file = fso.OpenBinaryFile(DownFileName, 1, false)
Response.BinaryWrite file.ReadAll
Response.End
set file = nothing
set fso = nothing
End Sub
Sub viewfile()
dim fso
set fso = server.createobject("scripting.filesystemobject")
if fso.getfile(request("file")).size > 1048576 then
Err.Raise 3, "한머리의 조언", "1M이상의 파일을 열 수 없습니다."
else
response.write "<form action=""?command=editfile&file=" & server.urlencode(request("file")) & """ method=post>"
response.write "<textarea name=editfile cols=65 rows=20>"
response.write fso.opentextfile(request("file")).readall
response.write "</textarea>"
response.write "<input type=submit value=""수정하기""> <input type=reset>"
response.write "</form>"
end if
set fso = nothing
End Sub
Sub editFile()
Dim fso
Set fso = Server.CreateObject("Scripting.FileSystemObject")
fso.opentextfile(request("file"),2).write request("editfile")
Set fso = Nothing
response.redirect "?command=folders&folder=" & server.urlencode(mid(request("file"),1,instrrev(request("file"),"\")-1))
End Sub
Sub delFile()
Dim key
Dim fso
Set fso = server.createobject("scripting.filesystemobject")
if request.form.count=0 then
call goback("폴더나 파일을 선택해주십시요")
else
for each key in request.form
if fso.FolderExists(key) then
fso.DeleteFolder(key)
else
fso.DeleteFile(key)
end if
next
Set fso = Nothing
call goback("요청하신 폴더및 파일이 삭제되었습니다.")
end if
End Sub
Sub upload()
dim uploadform
dim fso
dim fn
Set uploadform = Server.CreateObject("SiteGalaxyUpload.Form")
if uploadform.ContentDisposition <> "form-data" then
err.raise 3,"한머리의 조언", "잘못된 파일 전송 포멧입니다. 관리자에게 연락해주세요"
Exit Sub
end if
if uploadform.Item("ufile").Size > (1048576 * 5) then
Err.Raise 3,"한머리의 조언", "5M이상의 파일을 업로드 할 수 없습니다."
Exit Sub
end if
set fso = server.CreateObject("Scripting.FileSystemObject")
fn = uploadform.item("folder") & "\" & fso.GetFileName(uploadform("ufile").FilePath)
set fso = Nothing
uploadform("ufile").SaveAs(fn)
Set uploadform = Nothing
call goback("파일이 성공적으로 업로드되었습니다.")
End Sub
Sub copyFile()
dim Key
if request.form.count = 0 then
call goback("폴더나 파일을 선택해주십시요.")
else
Response.Cookies("webexplorer")("cmd")="copy"
Response.Cookies("webexplorer")("filelist")=""
For Each Key In request.form
Response.Cookies("webexplorer")("filelist")=Request.Cookies("webexplorer")("filelist") & Key & "/"
Next
call goback("")
end if
End Sub
Sub moveFile()
dim Key
if request.form.count = 0 then
call goback("폴더나 파일을 선택해주십시요.")
else
Response.Cookies("webexplorer")("cmd")="move"
Response.Cookies("webexplorer")("filelist")=""
For Each Key In request.form
Response.Cookies("webexplorer")("filelist")=Request.Cookies("webexplorer")("filelist") & Key & "/"
Next
call goback("")
end if
End Sub
Sub pasteFile()
dim fso
dim strFileList
dim i
if Request.Cookies("webexplorer")("cmd")="move" then
strFileList = split(Request.Cookies("webexplorer")("filelist"),"/")
Set fso = server.createobject("scripting.filesystemobject")
For i = 0 to Ubound(strFileList)-1
if fso.FolderExists(strFileList(i)) then
fso.MoveFolder strFileList(i), request.querystring("folder") & "\"
else
fso.MoveFile strFileList(i), request.querystring("folder") & "\"
end if
Next
set fso = Nothing
response.cookies("webexplorer")("filelist")=""
call goback("폴더 또는 파일 이동을 완료하였습니다.")
else
strFileList = split(Request.Cookies("webexplorer")("filelist"),"/")
Set fso = server.createobject("scripting.filesystemobject")
For i = 0 to Ubound(strFileList)-1
if fso.FolderExists(strFileList(i)) then
fso.CopyFolder strFileList(i), request.querystring("folder") & "\"
else
fso.CopyFile strFileList(i), request.querystring("folder") & "\"
end if
Next
set fso = Nothing
call goback("폴더 또는 파일 복사를 완료하였습니다.")
end if
End Sub
Sub dumpList()
dim strFileList
dim i
Response.write "대기 작업 : " & Request.Cookies("webexplorer")("cmd") & "<br>"
strFileList = split(Request.Cookies("webexplorer")("filelist"),"/")
For i = 0 to Ubound(strFileList)
response.write strFileList(i) & "<br>"
Next
End Sub
%>
<%
'Option Explicit
Class configs
Private mClassName
Private mConfigRootPath
Private mItems
Private mXmlRootNodeName
Private mConfigName
Private Sub Class_Initialize()
mClassName = "configs class"
mXmlRootNodeName = "configs"
mConfigRootPath = server.mappath("./")
End Sub
Public Sub Load(configname)
Dim xdom
Dim i
mConfigName = configname
Set mItems = Server.CreateObject("scripting.dictionary")
Set xdom = server.CreateObject("microsoft.xmldom")
xdom.load mconfigrootpath & "\" & configname & ".xml"
If xdom.parseerror.errorcode <> 0 Then
Err.raise vbObjectError, mClassName, xdom.parseerror.reason
Else
if xdom.documentelement.nodename = mXmlRootNodeName Then
For i=0 To xdom.documentelement.childnodes.length-1
mItems.add xdom.documentelement.childnodes(i).nodename, xdom.documentelement.childnodes(i).text
Next
Else
Err.raise vbObjectError, mClassName, "Invalid Configuration File"
End If
End If
Set xdom = nothing
End Sub
Public Sub Save()
Dim xdom
Dim i
Set xdom = server.CreateObject("microsoft.xmldom")
xdom.load mconfigrootpath & "\" & mConfigName & ".xml"
If xdom.parseerror.errorcode <> 0 Then
Err.raise vbObjectError, mClassName, xdom.parseerror.reason
Else
if xdom.documentelement.nodename = mXmlRootNodeName Then
For i= xdom.documentelement.childnodes.length-1 To 0 Step -1
xdom.documentelement.removechild(xdom.documentelement.childnodes(i))
Next
Dim keys, items, newelement
keys = mItems.keys()
items = mItems.items()
For i=0 To mItems.count-1
Set newelement = xdom.createElement(keys(i))
newelement.text = items(i)
xdom.documentelement.appendchild newelement
Set newelement = Nothing
Next
xdom.save mconfigrootpath & "\" & mConfigName & ".xml"
Else
Err.raise vbObjectError, mClassName, "Invalid Configuration File"
End If
End If
Set xdom = nothing
Set mItems = Nothing
End Sub
Public Sub Add(key, value)
mItems.Add key, value
End Sub
Public Function Item(key)
Item = mItems.Item(key)
End Function
End Class
'example.asp
'
'Dim a
'Set a = new configs
'a.load "example"
'response.write a.item("test1")
'a.add "test4", "33>3"
'a.save
'Set a = nothing
'example.xml
'
'<configs><test1>1111</test1><test2>2222</test2><test3>3333</test3></configs>
%>
<!--METADATA TYPE= "typelib" NAME= "ADODB Type Library"
FILE="C:\Program Files\Common Files\SYSTEM\ADO\msado15.dll" -->
<%
Class clsDBHelper
Private DefaultConnString
Private DefaultConnection
private sub Class_Initialize()
DefaultConnString = "Provider=SQLOLEDB;Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=1;"
Set DefaultConnection = Nothing
End Sub
'---------------------------------------------------
' SP를 실행하고, RecordSet을 반환한다.
'---------------------------------------------------
Public Function ExecSPReturnRS(spName, params, connectionString)
If IsObject(connectionString) Then
If connectionString is Nothing Then
If DefaultConnection is Nothing Then
Set DefaultConnection = CreateObject("ADODB.Connection")
DefaultConnection.Open DefaultConnString
End If
Set connectionString = DefaultConnection
End If
End If
Set rs = CreateObject("ADODB.RecordSet")
Set cmd = CreateObject("ADODB.Command")
cmd.ActiveConnection = connectionString
cmd.CommandText = spName
cmd.CommandType = adCmdStoredProc
Set cmd = collectParams(cmd, params)
'cmd.Parameters.Refresh
rs.CursorLocation = adUseClient
rs.Open cmd, ,adOpenStatic, adLockReadOnly
For i = 0 To cmd.Parameters.Count - 1
If cmd.Parameters(i).Direction = adParamOutput OR cmd.Parameters(i).Direction = adParamInputOutput OR cmd.Parameters(i).Direction = adParamReturnValue Then
If IsObject(params) Then
If params is Nothing Then
Exit For
End If
Else
params(i)(4) = cmd.Parameters(i).Value
End If
End If
Next
Set cmd.ActiveConnection = Nothing
Set cmd = Nothing
Set rs.ActiveConnection = Nothing
Set ExecSPReturnRS = rs
End Function
'---------------------------------------------------
' SQL Query를 실행하고, RecordSet을 반환한다.
'---------------------------------------------------
Public Function ExecSQLReturnRS(strSQL, params, connectionString)
If IsObject(connectionString) Then
If connectionString is Nothing Then
If DefaultConnection is Nothing Then
Set DefaultConnection = CreateObject("ADODB.Connection")
DefaultConnection.Open DefaultConnString
End If
Set connectionString = DefaultConnection
End If
End If
Set rs = CreateObject("ADODB.RecordSet")
Set cmd = CreateObject("ADODB.Command")
cmd.ActiveConnection = connectionString
cmd.CommandText = strSQL
cmd.CommandType = adCmdText
Set cmd = collectParams(cmd, params)
rs.CursorLocation = adUseClient
rs.Open cmd, , adOpenStatic, adLockReadOnly
Set cmd.ActiveConnection = Nothing
Set cmd = Nothing
Set rs.ActiveConnection = Nothing
Set ExecSQLReturnRS = rs
End Function
'---------------------------------------------------
' SP를 실행한다.(RecordSet 반환없음)
'---------------------------------------------------
Public Sub ExecSP(strSP,params,connectionString)
If IsObject(connectionString) Then
If connectionString is Nothing Then
If DefaultConnection is Nothing Then
Set DefaultConnection = CreateObject("ADODB.Connection")
DefaultConnection.Open DefaultConnString
End If
Set connectionString = DefaultConnection
End If
End If
Set cmd = CreateObject("ADODB.Command")
cmd.ActiveConnection = connectionString
cmd.CommandText = strSP
cmd.CommandType = adCmdStoredProc
Set cmd = collectParams(cmd, params)
cmd.Execute , , adExecuteNoRecords
For i = 0 To cmd.Parameters.Count - 1
If cmd.Parameters(i).Direction = adParamOutput OR cmd.Parameters(i).Direction = adParamInputOutput OR cmd.Parameters(i).Direction = adParamReturnValue Then
If IsObject(params) Then
If params is Nothing Then
Exit For
End If
Else
params(i)(4) = cmd.Parameters(i).Value
End If
End If
Next
Set cmd.ActiveConnection = Nothing
Set cmd = Nothing
End Sub
'---------------------------------------------------
' SP를 실행한다.(RecordSet 반환없음)
'---------------------------------------------------
Public Sub ExecSQL(strSQL,params,connectionString)
If IsObject(connectionString) Then
If connectionString is Nothing Then
If DefaultConnection is Nothing Then
Set DefaultConnection = CreateObject("ADODB.Connection")
DefaultConnection.Open DefaultConnString
End If
Set connectionString = DefaultConnection
End If
End If
Set cmd = CreateObject("ADODB.Command")
cmd.ActiveConnection = connectionString
cmd.CommandText = strSQL
cmd.CommandType = adCmdText
Set cmd = collectParams(cmd, params)
cmd.Execute , , adExecuteNoRecords
Set cmd.ActiveConnection = Nothing
Set cmd = Nothing
End Sub
'---------------------------------------------------
' 트랜잭션을 시작하고, Connetion 개체를 반환한다.
'---------------------------------------------------
Public Function BeginTrans(connectionString)
If IsObject(connectionString) Then
If connectionString is Nothing Then
connectionString = DefaultConnString
End If
End If
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open connectionString
conn.BeginTrans
Set BeginTrans = conn
End Function
'---------------------------------------------------
' 활성화된 트랜잭션을 커밋한다.
'---------------------------------------------------
Public Sub CommitTrans(connectionObj)
If Not connectionObj Is Nothing Then
connectionObj.CommitTrans
connectionObj.Close
Set ConnectionObj = Nothing
End If
End Sub
'---------------------------------------------------
' 활성화된 트랜잭션을 롤백한다.
'---------------------------------------------------
Public Sub RollbackTrans(connectionObj)
If Not connectionObj Is Nothing Then
connectionObj.RollbackTrans
connectionObj.Close
Set ConnectionObj = Nothing
End If
End Sub
'---------------------------------------------------
' 배열로 매개변수를 만든다.
'---------------------------------------------------
Public Function MakeParam(PName,PType,PDirection,PSize,PValue)
MakeParam = Array(PName, PType, PDirection, PSize, PValue)
End Function
'---------------------------------------------------
' 매개변수 배열 내에서 지정된 이름의 매개변수 값을 반환한다.
'---------------------------------------------------
Public Function GetValue(params, paramName)
For Each param in params
If param(0) = paramName Then
GetValue = param(4)
Exit Function
End If
Next
End Function
Public Sub Dispose
if (Not DefaultConnection is Nothing) Then
if (DefaultConnection.State = adStateOpen) Then DefaultConnection.Close
Set DefaultConnection = Nothing
End if
End Sub
'---------------------------------------------------------------------------
'Array로 넘겨오는 파라메터를 Parsing 하여 Parameter 객체를
'생성하여 Command 객체에 추가한다.
'---------------------------------------------------------------------------
Private Function collectParams(cmd,argparams)
If VarType(argparams) = 8192 or VarType(argparams) = 8204 or VarType(argparams) = 8209 then
params = argparams
For i = LBound(params) To UBound(params)
l = LBound(params(i))
u = UBound(params(i))
' Check for nulls.
If u - l = 4 Then
If VarType(params(i)(4)) = vbString Then
If params(i)(4) = "" Then
v = Null
Else
v = params(i)(4)
End If
Else
v = params(i)(4)
End If
cmd.Parameters.Append cmd.CreateParameter(params(i)(0), params(i)(1), params(i)(2), params(i)(3), v)
End If
Next
Set collectParams = cmd
Exit Function
Else
Set collectParams = cmd
End If
End Function
End Class
%>
<%
Sub viewCode(codefile)
response.write "<p style=""background-color=#eeeeee;"">"
set fso = server.createobject("scripting.filesystemobject")
set f = fso.opentextfile(server.mappath(codefile),1)
allViewCode = viewHTML(f.readall)
set f = nothing
response.write codingcolor(allviewcode,"brown")
response.write "</p>"
End Sub
'Coding부분을 찾아서 Coloring함수로...
function CodingColor(strTemp,strFontColor)
Dim firstPos
Dim lastPos
Dim leftString
Dim midString
Dim rightString
Dim xmidString
firstPos =1
lastPos = 1
do until lastPos >= len(strTemp)
firstPos = instr(lastPos, strTemp, "<%")
if firstPos <= 0 then
exit do
end if
lastPos = instr(firstPos, strTemp, "%>")
if lastPos <= 0 then
lastPos = len(strTemp)
end if
lastPos = lastPos + len("%>") - 1
leftString = left(strTemp,firstPos-1)
midString = mid(strTemp,firstPos,lastPos-firstPos+1)
rightString = mid(strTemp,lastPos+1,len(strTemp)-lastPos)
xmidString = coloring(midString)
' strTemp = leftString & xmidString & rightString
' lastPos = firstPos + len(xmidString)-1
strTemp = leftString & "<span style=color:" & strFontColor & ";>" & xmidString & "</span>" & rightString
lastPos = firstPos + len("<span style=color:" & strFontColor & ";>" & xmidString & "</span>")-1
loop
CodingColor = strTemp
end function
function coloring(strViewCode)
Dim Reservedwords
Dim aryReservedword
Dim i
Dim strFunction
Dim aryFunction
Reservedwords="And|Call|Case|Const|Dim|Do|Each|Else|ElseIf|Empty|End|Eqv|Erase|Error|Exit|Explicit|False|For|Function|If|Imp|In|Is|Loop|Mod|Next|Not|Nothing|Null|On|Option|Or|Private|Public|Randomize|ReDim|Resume|Select|Set|Step|Sub|Then|To|True|Until|Wend|While|Xor"
aryReservedword=split(Reservedwords,"|")
for i = 0 to ubound(aryReservedword)
strViewCode = wordReplace(strViewCode,aryReservedword(i),"blue")
next
strFunction="Anchor|Array|Asc|Atn|CBool|CByte|CCur|CDate|CDbl|Chr|CInt|CLng|Cos|CreateObject|CSng|CStr|Date|DateAdd|DateDiff|DatePart|DateSerial|DateValue|Day|Dictionary|Document|Element|Err|Exp|FileSystemObject|Filter|Fix|Int|Form|FormatCurrency|FormatDateTime|FormatNumber|FormatPercent|GetObject|Hex|History|Hour|InputBox|InStr|InstrRev|IsArray|IsDate|IsEmpty|IsNull|IsNumeric|IsObject|Join|LBound|LCase|Left|Len|Link|LoadPicture|Location|Log|LTrim|RTrim|Trim|Mid|Minute|Month|MonthName|MsgBox|Navigator|Now|Oct|Replace|Right|Rnd|Round|ScriptEngine|ScriptEngineBuildVersion|ScriptEngineMajorVersion|ScriptEngineMinorVersion|Second|Sgn|Sin|Space|Split|Sqr|StrComp|String|StrReverse|Tan|Time|TextStream|TimeSerial|TimeValue|TypeName|UBound|UCase|VarType|Weekday|WeekDayName|Window|Year"
aryFunction=split(strFunction,"|")
for i = 0 to ubound(aryFunction)
strViewCode = wordReplace(strViewCode,aryFunction(i),"red")
next
strviewcode = blockcomment(strviewcode,"""", "magenta")
strviewcode = linecomment(strviewcode,"'", "green")
coloring = linecomment(strviewcode,"Rem", "green")
end function
'HTML 보기에서 단어에 색상입히기
Function wordReplace(strSearchWithin,strSearchFor,fontcolor)
Dim lngStartingPosition
Dim lngFoundPosition
Dim strReplaced
Dim ascBlank
lngStartingPosition=1
lngFoundPosition=InStr(lngStartingPosition,strSearchWithin,strSearchFor,1)
do while lngFoundPosition > 0
ascBlank=asc(Mid(strSearchWithin,lngFoundPosition-1,1))
if (ascBlank>=48 and ascBlank<=57) or (ascBlank>=65 and ascBlank<=90) or (ascBlank>=97 and ascBlank<=122) then
strReplaced=strReplaced & Mid(strSearchWithin,lngStartingPosition,lngFoundPosition-lngStartingPosition) & mid(strSearchWithin,lngFoundPosition,len(strSearchFor))
else
ascBlank=asc(Mid(strSearchWithin,lngFoundPosition+len(strSearchFor),1))
if (ascBlank>=48 and ascBlank<=57) or (ascBlank>=65 and ascBlank<=90) or (ascBlank>=97 and ascBlank<=122) then
strReplaced=strReplaced & Mid(strSearchWithin,lngStartingPosition,lngFoundPosition-lngStartingPosition) & mid(strSearchWithin,lngFoundPosition,len(strSearchFor))
else
'found
strReplaced=strReplaced & Mid(strSearchWithin,lngStartingPosition,lngFoundPosition-lngStartingPosition) & "<font color=" & fontcolor & ">" & mid(strSearchWithin,lngFoundPosition,len(strSearchFor)) & "</font>"
end if
end if
lngStartingPosition=lngFoundPosition+len(strSearchFor)
lngFoundPosition=InStr(lngStartingPosition,strSearchWithin,strSearchFor,1)
Loop
wordReplace=strReplaced & Mid(strSearchWithin,lngStartingPosition) 'catch the last one
End Function
'HTML 보기
function viewHTML(strHTML)
viewHTML = replace(replace(replace(replace(replace(replace(strHTML,"&","&"),"<","<"),">",">")," "," ")," "," "),vbcrlf,"<br>" & vbcrlf)
end function
'줄단위 주석문 처리
function linecomment(strTemp, strCommentChar, strFontColor)
Dim firstPos
Dim lastPos
Dim leftString
Dim midString
Dim rightString
Dim xmidString
firstPos =1
lastPos = 1
do until lastPos >= len(strTemp)
firstPos = instr(lastPos, strTemp, strCommentChar)
if firstPos <= 0 then
exit do
end if
lastPos = instr(firstPos, strTemp, "<br>" & vbcrlf) + 5
if lastPos <= 0 then
lastPos = len(strTemp)
end if
'Single Quotation & "Rem" String Exception ("'", "Rem")
If not(mid(strTemp, firstPos-1, 1)="""" And mid(strTemp,firstPos + Len(strCommentChar),1)="""") Then
leftString = left(strTemp,firstPos-1)
midString = mid(strTemp,firstPos,lastPos-firstPos+1)
rightString = mid(strTemp,lastPos+1,len(strTemp)-lastPos)
xmidString = extractColor(midString)
strTemp = leftString & "<font color=" & strFontColor & ">" & xmidString & "</font>" & rightString
lastPos = instr(firstPos, strTemp, "<br>" & vbcrlf) + 6
Else
lastPos = lastPos + 1
End If
loop
linecomment = strTemp
end function
'블럭단위 주석문 처리
function blockcomment(strTemp, strCommentChar, strFontColor)
Dim firstPos
Dim lastPos
Dim leftString
Dim midString
Dim rightString
Dim xmidString
firstPos =1
lastPos = 1
do until lastPos >= len(strTemp)
firstPos = instr(lastPos, strTemp, strCommentChar)
if firstPos <= 0 then
exit do
end if
lastPos = instr(firstPos+len(strCommentChar), strTemp, strCommentChar)
if lastPos <= 0 then
lastPos = len(strTemp)
end if
lastPos = lastPos + len(strCommentChar)-1
leftString = left(strTemp,firstPos-1)
midString = mid(strTemp,firstPos,lastPos-firstPos+1)
rightString = mid(strTemp,lastPos+1,len(strTemp)-lastPos)
xmidString = extractColor(midString)
strTemp = leftString & "<font color=" & strFontColor & ">" & xmidString & "</font>" & rightString
lastPos = firstPos + len("<font color=" & strFontColor & ">" & xmidString & "</font>")
loop
blockcomment = strTemp
end function
function extractColor(strColor)
dim exfirstPos
dim exlastPos
Dim xleftString
Dim xmidString
Dim xrightString
extractColor = strColor
' exit function
exfirstPos =1
exlastPos = 1
do until exlastPos >= len(strColor)
exfirstPos = instr(exlastPos, strColor, "<font color=")
if exfirstPos <= 0 then
exit do
end if
exlastPos = instr(exfirstPos + 11, strColor, ">")
if exlastPos <= 0 then
exit do
end if
xleftString = left(strColor,exfirstPos-1)
xmidString = mid(strColor,exfirstPos,exlastPos-exfirstPos+1)
xrightString = mid(strColor,exlastPos+1,len(strColor)-exlastPos)
strColor = xleftString & xrightString
exlastPos = exfirstPos-1
exfirstPos = exlastPos
loop
extractColor = replace(strColor,"</font>","")
end function
%>
http://www.codeproject.com/KB/asp/aspcallwebservice.aspx
Introduction
Recently, I tried to use for the first time a webservice from an ASP page and I really had problems, after hours I could access to my webservice from ASP with Microsoft.XMLHTTP, but the code was not very easy (if it is your first time), so I decided to package the implementation in a simple vbscript class with a few properties that allow to access to a webservice.
The page that use the vbscript class is:
<!--#include virtual="/webservice.asp"-->
<html>
<head>
<title>testws</title>
</head>
<body>
<%
dim ws
set ws = new webservice
ws.url = "http://localhost/yourwebservice.asmx"
ws.method = "MethodName"
ws.parameters.Add "ParamName1",1
ws.parameters.Add "ParamName2",300
ws.parameters.Add "ParamNameN",500
ws.execute
response.Write ws.response
set ws = nothing
%>
</body>
</html>Like you can see, it is very simple to use; define the properties, call the execute method and the property response will return the information from webservice.
The class that implement the call to webservice is:
<%
option explicit
class WebService
public Url
public Method
public Response
public Parameters
public function execute()
dim xmlhttp
Set xmlhttp = CreateObject("Microsoft.XMLHTTP")
xmlhttp.open "POST", Url & "/" & Method, false
xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
xmlhttp.send Parameters.toString
response = xmlhttp.responseText
set xmlhttp = nothing
end function
Private Sub Class_Initialize()
Set Parameters = new wsParameters
End Sub
Private Sub Class_Terminate()
Set Parameters = Nothing
End Sub
End class
class wsParameters
public mCol
public function toString()
dim nItem
dim buffer
buffer = ""
for nItem = 1 to Count
buffer = buffer & Item(nItem).toString & "&"
next
if right(buffer,1)="&" then
buffer = left(buffer,len(buffer)-1)
end if
toString = buffer
end function
public sub Clear
set mcol = nothing
Set mCol = CreateObject("Scripting.Dictionary")
end sub
public sub Add(pKey,pValue)
dim newParameter
set newParameter = new wsParameter
newParameter.Key = pKey
newParameter.Value = pValue
mCol.Add mCol.count+1, newParameter
set newParameter = nothing
end sub
public function Item(nKey)
set Item=mCol.Item(nKey)
end function
public function ExistsXKey(pKey)
dim nItem
for nItem = 1 to mcol.count
if mCol.Item(nItem).key = pKey then
ExistsXKeyword = true
exit for
end if
next
end function
public sub Remove(nKey)
mCol.Remove(nKey)
end sub
public function Count()
Count=mCol.count
end function
Private Sub Class_Initialize()
Set mCol = CreateObject("Scripting.Dictionary")
End Sub
Private Sub Class_Terminate()
Set mCol = Nothing
End Sub
end class
class wsParameter
public Key
public Value
public function toString()
toString = Key & "=" & Value
end function
end class
%>
I hope that this small code of my implementation can help you, thanks, and if any question please send me an email.
License
This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.
A list of licenses authors might use can be found here
About the Author
asanoguera
Estudie computacion desde los 12 años, a los 18 ya estaba trabajando en una empresa que desarrollaba soluciones para clinicas y laboratorios bioquimicos en QuickBasic y BTrieve, a los 21 comence a trabajar en una consultora que desarrollaba soluciones a medida para empresas en QBX, VB5 y MSAccess, tambien me desempeñé como programador senior durante 5 años en un ente gubernamental realizando analisis y desarrollando sistemas de gestion y estadisticas para la toma de decisiones en VB6, ASP y MS-SQL 2000, independientemente desarrolle varios proyectos y trabaje tambien para empresas en el extranjero en ASP/ASP.NET y MS-SQL 2000, actualmente desarrollo aplicaciones web en ASP.NET 2.0, Atlas, con WebServices y MS-SQL 2000
Occupation: Web Developer
Location: Argentina
<%
'**************************************************************************************************************
'* GAB_LIBRARY Copyright (C) 2003 - This file is part of GAB_LIBRARY
'* For license refer to the license.txt
'**************************************************************************************************************
'**************************************************************************************************************
'' @CLASSTITLE: JSON
'' @CREATOR: Michal Gabrukiewicz (gabru at grafix.at), Michael Rebec
'' @CONTRIBUTORS: - Cliff Pruitt (opensource at crayoncowboy.com)
'' - Sylvain Lafontaine
'' @CREATEDON: 2007-04-26 12:46
'' @CDESCRIPTION: Comes up with functionality for JSON (http://json.org) to use within ASP.
'' Correct escaping of characters, generating JSON Grammer out of ASP datatypes and structures
'' @REQUIRES: -
'' @OPTIONEXPLICIT: yes
'' @VERSION: 1.4.1
'**************************************************************************************************************
class JSON
'private members
private output, innerCall
'public members
public toResponse ''[bool] should generated results be directly written to the response? default = false
'**********************************************************************************************************
'* constructor
'**********************************************************************************************************
public sub class_initialize()
newGeneration()
toResponse = false
end sub
'******************************************************************************************
'' @SDESCRIPTION: STATIC! takes a given string and makes it JSON valid
'' @DESCRIPTION: all characters which needs to be escaped are beeing replaced by their
'' unicode representation according to the
'' RFC4627#2.5 - http://www.ietf.org/rfc/rfc4627.txt?number=4627
'' @PARAM: val [string]: value which should be escaped
'' @RETURN: [string] JSON valid string
'******************************************************************************************
public function escape(val)
dim cDoubleQuote, cRevSolidus, cSolidus
cDoubleQuote = &h22
cRevSolidus = &h5C
cSolidus = &h2F
dim i, currentDigit
for i = 1 to (len(val))
currentDigit = mid(val, i, 1)
if asc(currentDigit) > &h00 and asc(currentDigit) < &h1F then
currentDigit = escapequence(currentDigit)
elseif asc(currentDigit) >= &hC280 and asc(currentDigit) <= &hC2BF then
currentDigit = "\u00" + right(padLeft(hex(asc(currentDigit) - &hC200), 2, 0), 2)
elseif asc(currentDigit) >= &hC380 and asc(currentDigit) <= &hC3BF then
currentDigit = "\u00" + right(padLeft(hex(asc(currentDigit) - &hC2C0), 2, 0), 2)
else
select case asc(currentDigit)
case cDoubleQuote: currentDigit = escapequence(currentDigit)
case cRevSolidus: currentDigit = escapequence(currentDigit)
case cSolidus: currentDigit = escapequence(currentDigit)
end select
end if
escape = escape & currentDigit
next
end function
'******************************************************************************************************************
'' @SDESCRIPTION: generates a representation of a name value pair in JSON grammer
'' @DESCRIPTION: the generation is done fully recursive so the value can be a complex datatype as well. e.g.
'' toJSON("n", array(array(), 2, true), false) or toJSON("n", array(RS, dict, false), false), etc.
'' @PARAM: name [string]: name of the value (accessible with javascript afterwards). leave empty to get just the value
'' @PARAM: val [variant], [int], [float], [array], [object], [dictionary], [recordset]: value which needs
'' to be generated. Conversation of the data types (ASP datatype -> Javascript datatype):
'' NOTHING, NULL -> null, ARRAY -> array, BOOL -> bool, OBJECT -> name of the type,
'' MULTIDIMENSIONAL ARRAY -> generates a 1 dimensional array (flat) with all values of the multidim array
'' DICTIONARY -> valuepairs. each key is accessible as property afterwards
'' RECORDSET -> array where each row of the recordset represents a field in the array.
'' fields have properties named after the column names of the recordset (LOWERCASED!)
'' e.g. generate(RS) can be used afterwards r[0].ID
'' INT, FLOAT -> number
'' OBJECT with reflect() method -> returned as object which can be used within JavaScript
'' @PARAM: nested [bool]: is the value pair already nested within another? if yes then the {} are left out.
'' @RETURN: [string] returns a JSON representation of the given name value pair
'' (if toResponse is on then the return is written directly to the response and nothing is returned)
'******************************************************************************************************************
public function toJSON(name, val, nested)
if not nested and not isEmpty(name) then write("{")
if not isEmpty(name) then write("""" & escape(name) & """: ")
generateValue(val)
if not nested and not isEmpty(name) then write("}")
toJSON = output
if innerCall = 0 then newGeneration()
end function
'******************************************************************************************************************
'* generate
'******************************************************************************************************************
private function generateValue(val)
if isNull(val) then
write("null")
elseif isArray(val) then
generateArray(val)
elseif isObject(val) then
if val is nothing then
write("null")
elseif typename(val) = "Dictionary" then
generateDictionary(val)
elseif typename(val) = "Recordset" then
generateRecordset(val)
else
generateObject(val)
end if
else
'bool
dim varTyp
varTyp = varType(val)
if varTyp = 11 then
if val then write("true") else write("false")
'int, long, byte
elseif varTyp = 2 or varTyp = 3 or varTyp = 17 or varTyp = 19 then
write(cLng(val))
'single, double, currency
elseif varTyp = 4 or varTyp = 5 or varTyp = 6 or varTyp = 14 then
write(replace(cDbl(val), ",", "."))
else
write("""" & escape(val & "") & """")
end if
end if
generateValue = output
end function
'******************************************************************************************************************
'* generateArray
'******************************************************************************************************************
private sub generateArray(val)
dim item, i
write("[")
i = 0
'the for each allows us to support also multi dimensional arrays
for each item in val
if i > 0 then write(",")
generateValue(item)
i = i + 1
next
write("]")
end sub
'******************************************************************************************************************
'* generateDictionary
'******************************************************************************************************************
private sub generateDictionary(val)
dim keys, i
innerCall = innerCall + 1
write("{")
keys = val.keys
for i = 0 to uBound(keys)
if i > 0 then write(",")
toJSON keys(i), val(keys(i)), true
next
write("}")
innerCall = innerCall - 1
end sub
'******************************************************************************************************************
'* generateRecordset
'******************************************************************************************************************
private sub generateRecordset(val)
dim i
write("[")
while not val.eof
innerCall = innerCall + 1
write("{")
for i = 0 to val.fields.count - 1
if i > 0 then write(",")
toJSON lCase(val.fields(i).name), val.fields(i).value, true
next
write("}")
val.movenext()
if not val.eof then write(",")
innerCall = innerCall - 1
wend
write("]")
end sub
'******************************************************************************************************************
'* generateObject
'******************************************************************************************************************
private sub generateObject(val)
dim props
on error resume next
set props = val.reflect()
if err = 0 then
on error goto 0
innerCall = innerCall + 1
toJSON empty, props, true
innerCall = innerCall - 1
else
on error goto 0
write("""" & escape(typename(val)) & """")
end if
end sub
'******************************************************************************************************************
'* newGeneration
'******************************************************************************************************************
private sub newGeneration()
output = empty
innerCall = 0
end sub
'******************************************************************************************
'* JsonEscapeSquence
'******************************************************************************************
private function escapequence(digit)
escapequence = "\u00" + right(padLeft(hex(asc(digit)), 2, 0), 2)
end function
'******************************************************************************************
'* padLeft
'******************************************************************************************
private function padLeft(value, totalLength, paddingChar)
padLeft = right(clone(paddingChar, totalLength) & value, totalLength)
end function
'******************************************************************************************
'* clone
'******************************************************************************************
public function clone(byVal str, n)
dim i
for i = 1 to n : clone = clone & str : next
end function
'******************************************************************************************
'* write
'******************************************************************************************
private sub write(val)
if toResponse then
response.write(val)
else
output = output & val
end if
end sub
end class
%>
editor/dialog 폴더에 있는 fck_image.html을 열어 27 라인쯤에 있는
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
라는 부분을 아래와 같이 수정한다.
<meta http-equiv="Content-Language" content="ko">
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
그럼 해결됩니다.
<script language="javascript">
self.opener=self;
self.close();
</script>
방법 2 : 프래임 속에있을때 닫는 법
<script language="javascript">
top.opener=self;
top.close();
</script>
에디트플러스2에 붙여쓸수 있는 태그 정리기 입니다.
복잡한 태그들과 php, js코드들을 정렬시켜줍니다.
실행파일 다운로드 : htmlarg.exe v2.0.2
소스코드 다운로드 : htmlarg.cpp
$2
- htmlarg.exe를 다운로드를 받아 Editplus 폴더에 넣는다.
- 에디트 플러스를 실행,, 메뉴->도구->사용자 도구 구성
- 추가버튼을 눌러 위와 같이 프로그램을 추가한다.
- 텍스트 필터 사용에 꼭 체크한다
- 저장하고 사용
$2
--------
ex) 2t D D D $(CurSel)
- 들여쓰기
0~9까지의 숫자, 탭문자를 이용하고 싶으면 t를 사용 - 코드들여쓰기
0~9까지의 숫자, 탭문자를 이용하고 싶으면 t를 사용
코드 정렬을 안하려면 n을 사용한다 - 태그리스트1
들여쓰기할 태그 리스트, D를 이용하면 기본 태그를 사용한다.
기본 목록은 tr,td,div,ol,ul,li 이다.
추가하고 싶다면, D뒤에 컴마(,)를 이용 추가하면 가능하다.
D를 없애고 직접 적어주는것도 가능하다. - 태그리스트2
들여쓰기는 안하지만 한줄에 하나만 있어야할 태그 리스트.
D를 이용하면 기본 태그를 사용한다.
기본 목록은 html,head,body,title,meta,table,link,map,select 이다. - 태그리스트3
정리를 안할 태그 리스트, D를 이용하면 기본 태그를 사용한다.
기본 목록은 pre,style 이다.
script와 ? 를 넣어두면 php와 jacsript가 html의 정렬과 상관없이 정렬된다.
- php javascript의 정렬
- 주석제거, PHP코드 제거 기능 제거
$2
- 2.0.1 : 정렬무시 기능 오작동 수정
- 2.0.2 : 태그이름이 겹치는경우(ex link,li) 옵션이 무시되는 버그수정
출처 : http://www.killrain.net/channel/lab/dev.php?mode=view&no=310
USE TEMPDB GO declare @hash varbinary (255) CREATE TABLE tempdb..h (id_num int, hash varbinary (255)) SET @hash = pwdencrypt('123') -- encryption INSERT INTO tempdb..h (id_num,hash) VALUES (1,@hash) SET @hash = pwdencrypt('123') INSERT INTO tempdb..h (id_num,hash) VALUES (2,@hash) SELECT TOP 1 @hash = hash FROM tempdb..h WHERE id_num = 2 SELECT pwdcompare ('123', @hash) AS [Success of check] -- Comparison SELECT * FROM tempdb..h INSERT INTO tempdb..h (id_num,hash) VALUES (3,CONVERT(varbinary (255), 0x01002D60BA07FE612C8DE537DF3BFCFA49CD9968324481C1A8A8FE612C8DE537DF3BFCFA49CD9968324481C1A8A8)) SELECT TOP 1 @hash = hash FROM tempdb..h WHERE id_num = 3 SELECT pwdcompare ('123', @hash) AS [Success of check] -- Comparison SELECT * FROM tempdb..h DROP TABLE tempdb..h GO |
Results
(1 row(s) affected) ------------------- 1 (1 row(s) affected) |
stored procedure를 사용하면서 exec statement를 사용하게 되는데 이렇게 되면 조금만 부주의해도 injection에 의한 공격이 허용되는 경우도 있고 같은 유형의 쿼리가 들어가도 미리 만들어진 실행계획을 이용하지 못하는 문제가 있어서 성능면에서 그 효과가 많이 줄어든다.
그에 반해 sp_executesql을 이용하게 되면 parameters를 이용할 수 있으므로 injection에 의한 공격에도 자유로울 수 있고 아래의 옮겨 놓은 ms sql의 도움말에 적혀 있듯이 비슷한 유형의 경우 기 실행계획을 이용하게 되는 경우가 있으니 상대적으로 성능면에서 유리한 면이 있고 이를 보고 일석이조라고 해야 하지 않을까 한다.
== 아래 == :: ms sql 도움말 옮김
sp_executesql
여러 번 사용할 수 있거나, 동적으로 만들어진 Transact-SQL문 또는 일괄 처리를 실행합니다. Transact-SQL문 또는 일괄 처리는 포함 매개 변수를 포함할 수 있습니다.
구문
sp_executesql [@stmt =] stmt[
{, [@params =] N'@parameter_name data_type [,...n]' }
{, [@param1 =] 'value1' [,...n] }
]
인수
[@stmt =] stmt
Transact-SQL문 또는 일괄 처리를 포함한 유니코드 문자열입니다. stmt는 암시적으로 ntext로 변환될 수 있는 변수 또는 유니코드 상수여야 합니다. + 연산자로 두 개의 문자열을 연결한 식 등과 같은 보다 복잡한 유니코드식은 사용할 수 없습니다. 문자 상수도 사용할 수 없습니다. 상수가 지정된 경우에는 N이라는 접두사가 있어야 합니다. 예를 들어, N'sp_who'라는 유니코드 상수는 사용할 수 있지만 'sp_who'는 사용할 수 없습니다. 문자열의 크기는 사용 가능한 데이터베이스 서버의 메모리의 용량에 따라서만 제한됩니다.
stmt는 변수 이름과 동일한 형식의 매개 변수를 포함할 수 있습니다. 예를 들면 다음과 같습니다.
N'SELECT * FROM Employees WHERE EmployeeID = @IDParameter'
stmt에 포함된 각 매개 변수에는 @params 매개 변수 정의 목록과 매개 변수 값 목록 모두에 해당되는 항목이 있어야 합니다.
[@params =] N'@parameter_name data_type [,...n]'
stmt에 포함된 모든 매개 변수의 정의를 포함하는 하나의 문자열입니다. 문자열은 암시적으로 ntext로 변환될 수 있는 변수 또는 유니코드 상수여야 합니다. 각 매개 변수의 정의는 매개 변수 이름과 데이터 형식으로 구성됩니다. n은 추가 매개 변수 정의를 나타내는 자리 표시자입니다. stmt에서 지정된 모든 매개 변수는 반드시 @params에서 정의되어야 합니다. stmt의 Transact-SQL문 또는 일괄 처리에 매개 변수가 없는 경우에는 @params가 필요하지 않습니다. 이 매개 변수의 기본값은 NULL입니다.
[@param1 =] 'value1'
매개 변수 문자열에서 정의된 첫번째 매개 변수의 값입니다. 값은 상수 또는 변수가 될 수 있습니다. stmt에 포함된 모든 매개 변수에 대해 제공되는 매개 변수 값이 있어야 합니다. stmt의 Transact-SQL문 또는 일괄 처리에 매개 변수가 없는 경우에는 값이 필요하지 않습니다.
n
추가 매개 변수의 값에 대한 자리 표시자입니다. 값은 상수 또는 변수만 가능합니다. 값은 함수 또는 연산자를 사용하여 작성된 표현식 등과 같이, 보다 복잡한 표현식이 될 수 없습니다.
반환 코드 값
0(성공) 또는 1(실패)
결과 집합
SQL 문자열에 작성된 모든 SQL문에서 결과 집합을 반환합니다.
비고
sp_executesql은 일괄 처리, 이름의 범위 및 데이터베이스 컨텍스트면에서 EXECUTE와 동작이 동일합니다. sp_executesql stmt 매개 변수의 Transact-SQL문 또는 일괄 처리는 sp_executesql이 실행될 때까지 컴파일되지 않습니다. stmt의 내용은 sp_executesql이라는 일괄 처리의 실행 계획과 별도로 컴파일되고 실행됩니다. sp_executesql 일괄 처리는 sp_executesql을 호출하는 일괄 처리에서 선언된 변수를 참조할 수 없습니다. sp_executesql 일괄 처리의 로컬 커서 또는 변수는 sp_executesql을 호출하는 일괄 처리에는 보이지 않습니다. 데이터베이스 컨텍스트 내의 변경 사항은 sp_executesql문이 종료될 때까지만 지속됩니다.
문에 대한 매개 변수의 변경 사항이 변형뿐인 경우, Transact-SQL문을 여러 번 실행하기 위해 저장 프로시저 대신 sp_executesql을 사용할 수 있습니다. Transact-SQL문 자체에 상수가 남아 있으며 매개 변수 값만이 변경되었으므로 Microsoft® SQL Server™ 쿼리 최적화 프로그램이 첫번째 실행에 대해 생성된 실행 계획을 다시 사용할 확률이 높습니다.
참고 문의 문자열에 있는 개체 이름이 정식으로 규정되지 않은 경우에는 실행 계획이 다시 사용되지 않습니다.
sp_executesql은 Transact-SQL 문자열과 별도로 매개 변수 값의 설정을 지원합니다.
DECLARE @IntVariable INT
DECLARE @SQLString NVARCHAR(500)
DECLARE @ParmDefinition NVARCHAR(500)
/* Build the SQL string once.*/
SET @SQLString =
N'SELECT * FROM pubs.dbo.employee WHERE job_lvl = @level'
SET @ParmDefinition = N'@level tinyint'
/* Execute the string with the first parameter value. */
SET @IntVariable = 35
EXECUTE sp_executesql @SQLString, @ParmDefinition,
@level = @IntVariable
/* Execute the same string with the second parameter value. */
SET @IntVariable = 32
EXECUTE sp_executesql @SQLString, @ParmDefinition,
@level = @IntVariable
sp_executesql에서 매개 변수를 대치할 수 있는 경우에는 EXECUTE문을 사용하여 문자열을 실행하는 데 있어서 다음과 같은 장점이 있습니다.
- sp_executesql 문자열에 있는 Transact-SQL문의 실제 텍스트가 실행 사이에 변경되지 않으므로 쿼리 최적화 프로그램이 두 번째 실행의 Transact-SQL문과 첫번째 실행에 대해 생성된 실행 계획을 일치시킬 가능성이 있습니다. 따라서 SQL Server가 두 번째 문을 컴파일할 필요가 없습니다.
- Transact-SQL 문자열이 단 한 번만 작성됩니다.
- 정수 매개 변수는 자신의 기본 형식으로 지정됩니다. 유니코드를 캐스팅할 필요가 없습니다.
사용 권한
public 역할에 대한 기본 권한을 실행합니다.
예제
A. 단순 SELECT문 실행
다음은 @level이라는 포함 매개 변수를 포함한 단순 SELECT 문을 작성하고 실행하는 예제입니다.
execute sp_executesql
N'select * from pubs.dbo.employee where job_lvl = @level',
N'@level tinyint',
@level = 35
B. 동적으로 작성된 문자열 실행
다음은 sp_executesql을 사용하여 동적으로 작성된 문자열을 실행하는 예제입니다. 예로 든 저장 프로시저는 일 년 간의 판매 데이터를 파티션으로 분리하는데 사용되는 일련의 테이블에 데이터를 삽입하는 데 사용됩니다. 일 년의 각 달에는 다음과 같은 형식의 테이블이 한 개씩 있습니다.
CREATE TABLE May1998Sales
(OrderID INT PRIMARY KEY,
CustomerID INT NOT NULL,
OrderDate DATETIME NULL
CHECK (DATEPART(yy, OrderDate) = 1998),
OrderMonth INT
CHECK (OrderMonth = 5),
DeliveryDate DATETIME NULL,
CHECK (DATEPART(mm, OrderDate) = OrderMonth)
)
파티션으로 분리된 테이블에서 데이터를 검색하는 것에 관한 자세한 내용은 파티션으로 분리된 데이터로 보기 사용을 참조하십시오.
각 테이블의 이름은 달 이름의 첫 세 글자, 연도를 표시하는 네 자리 수 및 상수인 Sales로 구성됩니다. 이름은 주문 날짜에서 동적으로 작성될 수 있습니다.
/* Get the first three characters of the month name. */
SUBSTRING( DATENAME(mm, @PrmOrderDate), 1, 3) +
/* Concatenate the four-digit year; cast as character. */
CAST(DATEPART(yy, @PrmOrderDate) AS CHAR(4) ) +
/* Concatenate the constant 'Sales'. */
'Sales'
이러한 견본 저장 프로시저는 동적으로 INSERT 문을 작성하고 실행하여 새 주문을 올바른 테이블에 삽입합니다. 또한 반드시 데이터를 포함해야 하는 테이블의 이름을 작성하는 데 주문 날짜를 사용하며, 작성된 이름은 INSERT 문에 병합됩니다. 이는 sp_executesql의 단순한 예입니다. 여기에는 오류 확인 및 테이블 간에 주문 번호가 중복되지 않았는지를 확인하는 등의 업무 규칙 확인이 포함되지 않습니다.
CREATE PROCEDURE InsertSales @PrmOrderID INT, @PrmCustomerID INT,
@PrmOrderDate DATETIME, @PrmDeliveryDate DATETIME
AS
DECLARE @InsertString NVARCHAR(500)
DECLARE @OrderMonth INT
-- Build the INSERT statement.
SET @InsertString = 'INSERT INTO ' +
/* Build the name of the table. */
SUBSTRING( DATENAME(mm, @PrmOrderDate), 1, 3) +
CAST(DATEPART(yy, @PrmOrderDate) AS CHAR(4) ) +
'Sales' +
/* Build a VALUES clause. */
' VALUES (@InsOrderID, @InsCustID, @InsOrdDate,' +
' @InsOrdMonth, @InsDelDate)'
/* Set the value to use for the order month because
functions are not allowed in the sp_executesql parameter
list. */
SET @OrderMonth = DATEPART(mm, @PrmOrderDate)
EXEC sp_executesql @InsertString,
N'@InsOrderID INT, @InsCustID INT, @InsOrdDate DATETIME,
@InsOrdMonth INT, @InsDelDate DATETIME',
@PrmOrderID, @PrmCustomerID, @PrmOrderDate,
@OrderMonth, @PrmDeliveryDate
GO
이 프로시저에서는 EXECUTE를 실행하는 것보다 sp_executesql을 실행하여 문자열을 실행하는 것이 더 효과적입니다. sp_executesql을 실행하는 경우, 각 개월별 테이블에 대해 한 개씩, 12 버전의 INSERT 문자열만이 생성됩니다. EXECUTE의 경우, 매개 변수 값이 다르므로 각 INSERT 문자열이 고유합니다. 두 가지 방법 모두 같은 수의 일괄 처리를 생성하지만 sp_executesql에 의해 생성된 INSERT 문자열의 유사성으로 인해 쿼리 최적화 프로그램이 실행 계획을 다시 사용할 확률이 높습니다.
public class testvbscriptcallabledll { public string testmethod() { return "this is a string returned from .net compiled library"; } }
콘솔에서 해당 경로로 이동 아래와 같이 컴파일 합니다.
csc /nologo /t:library test.cs
그리고 어셈블리에 등록 합니다.
regasm /nologo /codebase test.dll
그리고 아래와 같이 test.vbs를 작성합니다.
Dim f Set f = CreateObject("testvbscriptcallabledll") msgbox f.testmethod Set f = Nothing
test.vbs를 실행합니다. :)