출처 : https://www.it-swarm-ko.tech/ko/c%23/appconfig%ec%97%90%ec%84%9c-%ec%97%b0%ea%b2%b0-%eb%ac%b8%ec%9e%90%ec%97%b4-%ec%95%94%ed%98%b8%ed%99%94/1068388488/

 

c# — app.config에서 연결 문자열 암호화

App.config에서 연결 문자열을 암호화하는 데 문제가 있습니다. app.config의 connectionStrings 섹션을 보호하는 코드가 있지만 비밀번호는 여전히 일반 텍스트로 표시됩니다. 배포시 연결 문자열이 일반

www.it-swarm-ko.tech

 

 

App.config에서 연결 문자열을 암호화하는 데 문제가 있습니다. app.config의 connectionStrings 섹션을 보호하는 코드가 있지만 비밀번호는 여전히 일반 텍스트로 표시됩니다.

배포시 연결 문자열이 일반 텍스트가 아니도록 연결 문자열을 암호화해야합니다. web.config의 경우 SO에 대해서는 비슷한 질문이 있지만 app.config는 아닙니다).

c#sql-server-2008app-config

 42

2012. 7. 24.Blade3

 

이 기사 를 살펴보면 매우 유용한 예가 있습니다. 기본적으로 System.Configuration.SectionInformation.ProtectSection 도와 드리겠습니다.

보호 된 구성 구현

 23

2012. 7. 24.John Mitchell

The most convenient and reliable file storage service

Receive your personal cloud storage with 2Gb of space for free

App.config의 이름을 web.config로 바꾸고 aspnet_regiis 도구로 암호화 한 다음 app.config로 다시 바꾸어야하는 web.config와 동일한 솔루션을 쉽게 적용 할 수 있습니다.

  1. App.config를 web.config로 이름을 바꿉니다.
  2. 명령 프롬프트를 열고 다음을 입력하십시오.
    %windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pef "connectionStrings" c:\<folder containing your web.config> (폴더 수준에서 멈추고 후행 "\"를 넣지 마십시오)
  3. web.config의 이름을 app.config로 다시 바꿉니다.

암호화 된 파일을보기 위해 메모장에서 열 수 있습니다. Visual Studio에서는 암호가 해독 된 것을 볼 수 있습니다. 암호화되지 않은 것처럼 연결 문자열을 사용할 수 있습니다.

 50

2015. 3. 21.benoit

config 파일의 위치를 ​​정의하십시오.

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

connectionStrings를 암호화하려는 경우

config.ConnectionStrings.SectionInformation.ProtectSection(Nothing);

앱 구성 부분을 알고 있어야합니다

AppSettings를 암호화하려면

config.AppSettings.SectionInformation.ProtectSection(Nothing);

 3

2016. 12. 11.Salem Ahmed

이것을 자동화하는 방법 :

프로젝트 설정> 컴파일> BuildEvents> 빌드 후 편집

아래 코드를 붙여 넣습니다.

SET ApplicationName=YourAppWithoutExtention echo. echo POST BUILD ACTIONS echo ==================== if EXIST web.config ( echo Deleting web.config DEL web.config ) echo Renaming %ApplicationName%.exe.config to web.config REN %ApplicationName%.exe.config web.config echo Running aspnet_regis against webconfig SET rpath=%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pef "connectionStrings" "$(TargetDir) SET rpath=%rpath:~0,-1%" echo Path: %rpath% %rpath% echo Renaming web.config to %ApplicationName%.exe.config REN web.config %ApplicationName%.exe.config echo Done.

"YourAppWithoutExtention"을 앱 이름으로 바꿉니다.

그런 다음 빌드 할 때마다 app.config가 자동으로 암호화됩니다.

 2

2019. 1. 6.stigzler

 App.config file to web.config<br> 이름을 바꿉니다. • 관리자 권한으로 명령 프롬프트를 실행합니다.

암호화의 경우 :

따옴표 안에있는 프로젝트 위치 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -pef "connectionStrings"  -prov "DataProtectionConfigurationProvider"

전의:

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -pef "connectionStrings" "D:\location\location1\location" -prov "DataProtectionConfigurationProvider"

복호화의 경우 :

따옴표 내에서 프로젝트 위치를 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -pdf "connectionStrings".

전의:

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -pdf "connectionStrings" "D:\location1\location"

오류의 경우 :

구성에서 추가 xmlns="http://schemas.Microsoft.com/.NetConfiguration/v2.0"

이처럼 :

• 마지막으로 web.config의 이름을 App.Config로 바꿉니다.

 2

2018. 10. 11.anantha Krishnan

Flexible, reliable and affordable cloud hosting

Sign up and get $50 bonus within 30-day!

또한 웹 팜 에 연결 문자열을 암호화 및 해독하려는 사람이있는 경우 다음 단계를 수행하십시오.

  1. RSA 키를 작성하십시오. aspnet_regiis -pc "MyKeys" -exp

  2. 이 키에 응용 프로그램 풀 ID에 대한 액세스 권한을 부여하십시오. aspnet_regiis -pa "MyKeys" "IIS AppPool\ApplicationPoolName" -full

  3. Web.config에 RSA 제공자를 추가하십시오. <configuration> <configProtectedData> <providers> <add name="MyProvider" type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" keyContainerName="MyKeys" useMachineContainer="true" /> </providers> </configProtectedData> </configuration>

  4. RSA 제공자를 사용하여 web.config를 암호화하십시오. aspnet_regiis -pe "connectionStrings" -app "/MyApplication" -prov "MyProvider" 참고 : 단일 서버 시나리오에서 사용했던 것과 같은 대체 구문을 사용할 수 있습니다. 예: ASPNET_REGIIS -pef "connectionStrings" "D:\inetpub\wwwroot\applicationFolder" -prov "MyProvider"

  5. Web.config를 열고 연결 문자열이 암호화되었는지 확인
  6. 사이트를 테스트하고 작동하는지 확인
  7. Web.config를 해독하십시오. 아래 코드를 사용하여 test.aspx 파일을 만듭니다. 해독 된 파일을 보려면 그것을 찾아보십시오
  8. RSA 키를 C 드라이브로 내 보냅니다. aspnet_regiis -px "MyKeys" "c:\keys.xml" -pri
  9. 이 파일을 웹 팜의 두 번째 서버로 복사
  10. 해당 서버로 가져옵니다. aspnet_regiis -pi "MyKeys" "c:\keys.xml"
  11. 이 키에 대한 액세스 권한 부여 (2 단계와 동일)
  12. 두 번째 서버에서 애플리케이션 테스트

출처 : 연결 문자열을 암호화하고 해독하는 방법

 

#c# #config #aspnet_regiis

Posted by 요지
,

[MSSQL] 동적관리뷰 DMV

SQL 2020. 3. 24. 13:24
출처 : https://thinkgm.tistory.com/entry/%EB%8F%99%EC%A0%81-%EA%B4%80%EB%A6%AC-%EB%B7%B0

---------------------------------------------------------------

 

DMV(동적 관리 뷰, Dynamic Management Views)란?

  • 성능 관련 정보를 수집하기 위한 도구.

  • SQL Server 모니터링 역할.

  • 성능 최적화 및 문제점을 진단하는 용도로 사용 됨.

 

1. DMV를 확인하기 위해 사전에 부여될 권한들

  • GRANT VIEW SERVER STATE TO '계정'     / VIEW SERVER STATE 권한
  • GRANT VIEW DATABASE STATE TO '계정' /  VIEW DATABASE STATE 권한 부여

 

2. 동적 관리 함수 및 뷰 리스트 정보

 

 

 

3. 자주쓰는 동적 관리뷰

  • sys.dm_exec_query_stats
  • sys.dm_exec_procedure_stats
  • sys.dm_exec_sql_text
  • sys.dm_exec_query_plan

     

[sys.dm_exec_query_stats 정보]


 

[sys.dm_exec_procedure_stats 정보]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

사용 용도 : 

1. 조각화가 많이 발생하는 인덱스 확인.

 

[참고 이미지]

실행 시간 : 17분 소요.

 


2. CPU 사용량이 높은 쿼리 확인

 

 

3. 비용이 드는 쿼리 찾아내기

 

 

4.  SP 분석하기

 

 

 

 


1. 저장프로시져별 실행수 뽑기 

select db_name(st.dbid) DBName
,object_schema_name(st.objectid,dbid) SchemaName
,object_name(st.objectid,dbid) StoredProcedure
,sum(qs.execution_count) Execution_count
from sys.dm_exec_cached_plans cp
join sys.dm_exec_query_stats qs on cp.plan_handle=qs.plan_handle
cross apply sys.dm_exec_sql_text(cp.plan_handle)st
where DB_Name(st.dbid) is not null and cp.objtype = 'proc'
group by DB_Name(st.dbid),object_schema_name(objectid,st.dbid),object_name(objectid,st.dbid)
order by sum(qs.execution_count) desc


2. CPU소모량이 많은 저장프로시져 뽑기

select db_name(st.dbid) DBName
,object_schema_name(st.objectid,dbid) SchemaName
,object_name(st.objectid,dbid) StoredProcedure
,sum(qs.execution_count) Execution_count
,sum(qs.total_worker_time) total_cpu_time
,sum(qs.total_worker_time) / (sum(qs.execution_count) * 1.0) avg_cpu_time
from sys.dm_exec_cached_plans cp join sys.dm_exec_query_stats qs on cp.plan_handle=qs.plan_handle
cross apply sys.dm_exec_sql_text(cp.plan_handle) st
where db_name(st.dbid) is not null and cp.objtype='proc'
group by db_name(st.dbid), object_schema_name(objectid,st.dbid), object_name(objectid,st.dbid)
order by sum(qs.total_worker_time) desc


3. IO량이 많은 저장프로시져 뽑기

select db_name(st.dbid) DBName
,object_schema_name(objectid,st.dbid) SchemaName
,object_name(objectid,st.dbid) StoredProcedure
,sum(execution_count) execution_count
,sum(qs.total_physical_reads+qs.total_logical_reads+qs.total_logical_writes) total_IO
,sum(qs.total_physical_reads+qs.total_logical_reads+qs.total_logical_writes) / sum
(execution_count) avg_total_IO
,sum(qs.total_physical_reads) total_physical_reads
,sum(qs.total_physical_reads) / (sum(execution_count) * 1.0) avg_physical_read
,sum(qs.total_logical_reads) total_logical_reads
,sum(qs.total_logical_reads) / (sum(execution_count) * 1.0) avg_logical_read
,sum(qs.total_logical_writes) total_logical_writes
,sum(qs.total_logical_writes) / (sum(execution_count) * 1.0) avg_logical_writes
from sys.dm_exec_query_stats qs cross apply sys.dm_exec_sql_text(qs.plan_handle) st
join sys.dm_exec_cached_plans cp on qs.plan_handle = cp.plan_handle
where db_name(st.dbid) is not null and cp.objtype = 'proc'
group by db_name(st.dbid),object_schema_name(objectid,st.dbid), object_name(objectid,st.dbid)
order by sum(qs.total_physical_reads+qs.total_logical_reads+qs.total_logical_writes) desc


4. 처리시간이 긴 저장프로시져 뽑기

select db_name(st.dbid) DBName
,object_schema_name(objectid,st.dbid) SchemaName
,object_name(objectid,st.dbid) StoredProcedure
,sum(execution_count) execution_count
,sum(qs.total_elapsed_time) total_elapsed_time
,sum(qs.total_elapsed_time) / sum(execution_count) avg_elapsed_time
from sys.dm_exec_query_stats qs cross apply sys.dm_exec_sql_text(qs.plan_handle)st
join sys.dm_exec_cached_plans cp on qs.plan_handle = cp.plan_handle
where db_name(st.dbid) is not null and cp.objtype = 'proc'
group by db_name(st.dbid),object_schema_name(objectid,st.dbid),object_name(objectid,st.dbid)
order by sum(qs.total_elapsed_time) desc

출처: https://dbrang.tistory.com/716?category=198409 [dBRang [dɪ'·bɪ·raŋ]]

 

 

XEvent(확장 이벤트)

: 성능 리소스를 적게 사용하는 간단한 성능 모니터링 시스템.

확장 이벤트에서는새 세션 마법사 와 새 세션이라는 두 가지 그래픽 사용자 인터페이스가 제공되므로 세션 데이터를 작성, 수정, 표시 및 분석할 수 있습니다.

[용도]

 

  • 가장 비용이 많이 드는 쿼리 찾기

  • 래치 경합의 근본 원인 찾기

  • 다른 쿼리를 차단하는 쿼리 찾기

  • 쿼리 재컴파일에 의해 발생하는 과도한 CPU 사용 문제 해결

  • 교착 상태 해결

 

참고 링크 :  https://docs.microsoft.com/ko-kr/sql/relational-databases/extended-events/advanced-viewing-of-target-data-from-extended-events-in-sql-server?view=sql-server-2017

 

예시)

 

 

CREATE TABLE TestTable (

c1 INT IDENTITY,

c2 CHAR (1000) DEFAULT 'a');

GO

 

INSERT INTO [TestTable] DEFAULT VALUES;

GO

 

 

 

XEvent를 설정한다.

 

-- Drop the session if it exists.

IF EXISTS (

SELECT * FROM sys.server_event_sessions

WHERE [name] = N'MonitorLog')

DROP EVENT SESSION [MonitorLog] ON SERVER

GO

 

-- Create the event session

CREATE EVENT SESSION [MonitorLog] ON SERVER

ADD EVENT [sqlserver].[file_write_completed],

ADD EVENT [sqlserver].[transaction_log]

ADD TARGET [package0].[ring_buffer]

WITH (MAX_MEMORY = 50MB, max_dispatch_latency = 1 seconds)

GO

 

-- Start the session

ALTER EVENT SESSION [MonitorLog] ON SERVER

STATE = START;

GO

 

 

 

 

참고 자료

https://docs.microsoft.com/ko-kr/sql/relational-databases/system-dynamic-management-views/system-dynamic-management-views?view=sql-server-2017 

https://rocabilly.tistory.com/103  

https://m.blog.naver.com/PostView.nhn?blogId=chsmanager&logNo=220511665320&proxyReferer=https%3A%2F%2Fwww.google.com%2F

https://rocabilly.tistory.com/105

http://www.sqler.com/bColumn/900579

 



출처: https://thinkgm.tistory.com/entry/동적-관리-뷰 [minkgm12]

출처: https://thinkgm.tistory.com/entry/동적-관리-뷰 [minkgm12]

Posted by 요지
,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
OperationContext context = OperationContext.Current;
MessageProperties properties = context.IncomingMessageProperties;
RemoteEndpointMessageProperty endpoint = properties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
string address = string.Empty;
//http://www.simosh.com/article/ddbggghj-get-client-ip-address-using-wcf-4-5-remoteendpointmessageproperty-in-load-balanc.html
if (properties.Keys.Contains(HttpRequestMessageProperty.Name))
{
    HttpRequestMessageProperty endpointLoadBalancer = properties[HttpRequestMessageProperty.Name] as HttpRequestMessageProperty;
    if (endpointLoadBalancer != null && endpointLoadBalancer.Headers["X-Forwarded-For"!= null)
        address = endpointLoadBalancer.Headers["X-Forwarded-For"];
}
if (string.IsNullOrEmpty(address))
{
    address = endpoint.Address;
}
 
 
 
-----------------------------------------------
 
private string GetIP()
{
   OperationContext context = OperationContext.Current;
   MessageProperties prop = context.IncomingMessageProperties;
   RemoteEndpointMessageProperty endpoint =
      prop[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
   string ip = endpoint.Address;
 
   return ip ;
 
}
 
 
cs
Posted by 요지
,



출처: https://windtrap.tistory.com/95 [곰탱이의 개인블로그]

 

 

[SQL2012] 결과집합의 이전 행과 다음 행 데이터를 가져오는 LAG, LEAD 함수

SQL Server 2012의 신규 함수로 LAG, LEAD 가 있습니다. 이미 오라클에서는 지원하고 있었지만, SQL Server 는 2012에 포함되었네요. LAG 함수는 현재 결과집합에서 이전 행의 데이터를 가져오는 함수이고, LEAD..

windtrap.tistory.com

-------------------------------------------------------------------------------

 

 

 

SQL Server 2012의 신규 함수로 LAG, LEAD 가 있습니다.

이미 오라클에서는 지원하고 있었지만, SQL Server 는 2012에 포함되었네요.

 

LAG 함수는 현재 결과집합에서 이전 행의 데이터를 가져오는 함수이고,

LEAD 함수는 LAG와 반대로 현재 결과집합에서 다음 행의 데이터를 가져오는 함수입니다.

 

이 함수가 나오기 이전에는 SELF JOIN을 사용하거나 CTE(Common Table Expression)을 사용해야 했습니다.

 

각설하고... SQL Server 2012의 샘플DB인 AdventureWoks2012 데이터베이스에서 예제를 만들어 보았습니다.

 

1. 원본 데이터 SELECT 



USE AdventureWorks2012
GO


SELECT
        ProductID, ModifiedDate, StandardCost
FROM
        Production.ProductCostHistory
WHERE
        ProductID IN (711, 712, 713)
ORDER BY
        ProductID, ModifiedDate
 


 

 

2. CTE 로 구현.



WITH LAG_LEAD_CTE
AS
(
        SELECT
               ROW_NUMBER() OVER (ORDER BY ProductID, ModifiedDate) AS RN, ProductID, ModifiedDate, StandardCost
        FROM
               Production.ProductCostHistory
        WHERE
               ProductID IN (711, 712, 713)
)
SELECT
        A.ProductID, A.StandardCost, A.ModifiedDate, B.StandardCost AS PrevStandardCost, C.StandardCost AS NextStandardCost
FROM
        LAG_LEAD_CTE A LEFT JOIN LAG_LEAD_CTE B ON A.ProductID = B.ProductID AND A.RN = B.RN + 1
        LEFT JOIN LAG_LEAD_CTE C ON A.ProductID = C.ProductID AND A.RN = C.RN - 1
ORDER BY
        A.ProductID, A.ModifiedDate
;



 ROW_NUMBER  를 주고 재귀쿼리를 이용,  뒤의 ROW, 앞의 ROW 와 조인하여  결과를 보여줍니다.

 

 

3. LAG / LEAD 함수를 사용하여 구현



SELECT
        ProductID, StandardCost, ModifiedDate,
        LAG(StandardCost, 1, NULL) OVER (PARTITION BY ProductID ORDER BY ModifiedDate) PrevStandardCost,
        LEAD(StandardCost, 1, NULL) OVER (PARTITION BY ProductID ORDER BY ModifiedDate) NextStandardCost
FROM
        Production.ProductCostHistory
WHERE
        ProductID IN (711, 712, 713)
ORDER BY ProductID, ModifiedDate
;



결과는 CTE와 LAG, LEAD 함수 사용 시 모두 같습니다만, 훨씬 구문이 가벼워진 것을 알 수 있습니다.

 

 

 

그럼 CTE로 구현했을 때와 LAG / LEAD 함수 로 구현했을 때의 성능 차이는 어느 정도일까요?

 

1) CTE 로 구현 시 IO 및 TIME 수치



SQL Server 구문 분석  컴파일 시간:
   CPU 시간 = 16ms, 경과 시간 = 25ms.
 
(9 행이 영향을 받음)
테이블 'Worktable'. 검색  0, 논리적 읽기  0, 물리적 읽기  0, 미리 읽기  0, LOB 논리적 읽기  0, LOB 물리적 읽기  0, LOB 미리 읽기  0.
테이블 'ProductCostHistory'. 검색  9, 논리적 읽기  18, 물리적 읽기  0, 미리 읽기  0, LOB 논리적 읽기  0, LOB 물리적 읽기  0, LOB 미리 읽기  0.
 
 SQL Server 실행 시간:
 CPU 시간 = 16밀리초, 경과 시간 = 4밀리초

 

2) LAG, LEAD 함수를 사용하여 구현 시 IO 및 TIME 수치



SQL Server 구문 분석  컴파일 시간:
   CPU 시간 = 11ms, 경과 시간 = 11ms.
 
(9 행이 영향을 받음)
테이블 'Worktable'. 검색  0, 논리적 읽기  0, 물리적 읽기  0, 미리 읽기  0, LOB 논리적 읽기  0, LOB 물리적 읽기  0, LOB 미리 읽기  0.
테이블 'ProductCostHistory'. 검색  3, 논리적 읽기  6, 물리적 읽기  0, 미리 읽기  0, LOB 논리적 읽기  0, LOB 물리적 읽기  0, LOB 미리 읽기  0.
 
 SQL Server 실행 시간:
 CPU 시간 = 0밀리초, 경과 시간 = 1밀리초

 

CTE보다 더 좋은 성능이 나오네요.

 

참고 URL

LAG : http://msdn.microsoft.com/ko-kr/library/hh231256.aspx

LEAD : http://msdn.microsoft.com/ko-kr/library/hh213125.aspx

 

 

Posted by 요지
,

출처 : https://kimdoky.github.io/git/2017/05/19/git-change-passwd.html



git config --unset credential.helper





Posted by 요지
,