/* First uninstall - this section is exactly the same as uninstall.sql */
USE master
GO
/* Drop the database containing our sprocs */
IF DB_ID('ASPState') IS NOT NULL BEGIN
DROP DATABASE ASPState
END
GO
/* Drop temporary tables */
IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE name = 'ASPStateTempSessions' AND type = 'U') BEGIN
DROP TABLE tempdb..ASPStateTempSessions
END
GO
IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE name = 'ASPStateTempApplications' AND type = 'U') BEGIN
DROP TABLE tempdb..ASPStateTempApplications
END
GO
/* Drop the startup procedure */
DECLARE @PROCID int
SET @PROCID = OBJECT_ID('ASPState_Startup')
IF @PROCID IS NOT NULL AND OBJECTPROPERTY(@PROCID, 'IsProcedure') = 1 BEGIN
DROP PROCEDURE ASPState_Startup
END
GO
/* Drop the obsolete startup enabler */
DECLARE @PROCID int
SET @PROCID = OBJECT_ID('EnableASPStateStartup')
IF @PROCID IS NOT NULL AND OBJECTPROPERTY(@PROCID, 'IsProcedure') = 1 BEGIN
DROP PROCEDURE EnableASPStateStartup
END
GO
/* Drop the obsolete startup disabler */
DECLARE @PROCID int
SET @PROCID = OBJECT_ID('DisableASPStateStartup')
IF @PROCID IS NOT NULL AND OBJECTPROPERTY(@PROCID, 'IsProcedure') = 1 BEGIN
DROP PROCEDURE DisableASPStateStartup
END
GO
/* Drop the ASPState_DeleteExpiredSessions_Job */
DECLARE @JobID BINARY(16)
SELECT @JobID = job_id
FROM msdb.dbo.sysjobs
WHERE (name = N'ASPState_Job_DeleteExpiredSessions')
IF (@JobID IS NOT NULL)
BEGIN
-- Check if the job is a multi-server job
IF (EXISTS (SELECT *
FROM msdb.dbo.sysjobservers
WHERE (job_id = @JobID) AND (server_id <> 0)))
BEGIN
-- There is, so abort the script
RAISERROR (N'Unable to import job ''ASPState_Job_DeleteExpiredSessions'' since there is already a multi-server job with this name.', 16, 1)
END
ELSE
-- Delete the [local] job
EXECUTE msdb.dbo.sp_delete_job @job_name = N'ASPState_Job_DeleteExpiredSessions'
END
USE master
GO
/* Create and populate the ASPState database */
CREATE DATABASE ASPState
GO
USE ASPstate
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
CREATE PROCEDURE DropTempTables
AS
IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE name = 'ASPStateTempSessions' AND type = 'U') BEGIN
DROP TABLE tempdb..ASPStateTempSessions
END
IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE name = 'ASPStateTempApplications' AND type = 'U') BEGIN
DROP TABLE tempdb..ASPStateTempApplications
END
RETURN 0
GO
CREATE PROCEDURE CreateTempTables
AS
/*
* Note that we cannot create user-defined data types in
* tempdb because sp_addtype must be run in the context
* of the current database, and we cannot switch to
* tempdb from a stored procedure.
*/
CREATE TABLE tempdb..ASPStateTempSessions (
SessionId CHAR(32) NOT NULL PRIMARY KEY,
Created DATETIME NOT NULL DEFAULT GETDATE(),
Expires DATETIME NOT NULL,
LockDate DATETIME NOT NULL,
LockCookie INT NOT NULL,
Timeout INT NOT NULL,
Locked BIT NOT NULL,
SessionItemShort VARBINARY(7000) NULL,
SessionItemLong IMAGE NULL,
)
CREATE TABLE tempdb..ASPStateTempApplications (
AppId INT NOT NULL IDENTITY PRIMARY KEY,
AppName CHAR(280) NOT NULL,
)
CREATE NONCLUSTERED INDEX Index_AppName ON tempdb..ASPStateTempApplications(AppName)
RETURN 0
GO
CREATE PROCEDURE ResetData
AS
EXECUTE DropTempTables
EXECUTE CreateTempTables
RETURN 0
GO
EXECUTE sp_addtype tSessionId, 'CHAR(32)', 'NOT NULL'
GO
EXECUTE sp_addtype tAppName, 'VARCHAR(280)', 'NOT NULL'
GO
EXECUTE sp_addtype tSessionItemShort, 'VARBINARY(7000)'
GO
EXECUTE sp_addtype tSessionItemLong, 'IMAGE'
GO
EXECUTE sp_addtype tTextPtr, 'VARBINARY(16)'
GO
CREATE PROCEDURE TempGetAppId
@appName tAppName,
@appId INT OUTPUT
AS
SELECT @appId = AppId
FROM tempdb..ASPStateTempApplications
WHERE AppName = @appName
IF @appId IS NULL BEGIN
INSERT tempdb..ASPStateTempApplications
(AppName)
VALUES
(@appName)
SELECT @appId = AppId
FROM tempdb..ASPStateTempApplications
WHERE AppName = @appName
END
RETURN 0
GO
CREATE PROCEDURE TempGetStateItem
@id tSessionId,
@itemShort tSessionItemShort OUTPUT,
@locked BIT OUTPUT,
@lockDate DATETIME OUTPUT,
@lockCookie INT OUTPUT
AS
DECLARE @textptr AS tTextPtr
DECLARE @length AS INT
DECLARE @now as DATETIME
SET @now = GETDATE()
UPDATE tempdb..ASPStateTempSessions
SET Expires = DATEADD(n, Timeout, @now),
@locked = Locked,
@lockDate = LockDate,
@lockCookie = LockCookie,
@itemShort = CASE @locked
WHEN 0 THEN SessionItemShort
ELSE NULL
END,
@textptr = CASE @locked
WHEN 0 THEN TEXTPTR(SessionItemLong)
ELSE NULL
END,
@length = CASE @locked
WHEN 0 THEN DATALENGTH(SessionItemLong)
ELSE NULL
END
WHERE SessionId = @id
IF @length IS NOT NULL BEGIN
READTEXT tempdb..ASPStateTempSessions.SessionItemLong @textptr 0 @length
END
RETURN 0
GO
CREATE PROCEDURE TempGetStateItemExclusive
@id tSessionId,
@itemShort tSessionItemShort OUTPUT,
@locked BIT OUTPUT,
@lockDate DATETIME OUTPUT,
@lockCookie INT OUTPUT
AS
DECLARE @textptr AS tTextPtr
DECLARE @length AS INT
DECLARE @now as DATETIME
SET @now = GETDATE()
UPDATE tempdb..ASPStateTempSessions
SET Expires = DATEADD(n, Timeout, @now),
@lockDate = LockDate = CASE Locked
WHEN 0 THEN @now
ELSE LockDate
END,
@lockCookie = LockCookie = CASE Locked
WHEN 0 THEN LockCookie + 1
ELSE LockCookie
END,
@itemShort = CASE Locked
WHEN 0 THEN SessionItemShort
ELSE NULL
END,
@textptr = CASE Locked
WHEN 0 THEN TEXTPTR(SessionItemLong)
ELSE NULL
END,
@length = CASE Locked
WHEN 0 THEN DATALENGTH(SessionItemLong)
ELSE NULL
END,
@locked = Locked,
Locked = 1
WHERE SessionId = @id
IF @length IS NOT NULL BEGIN
READTEXT tempdb..ASPStateTempSessions.SessionItemLong @textptr 0 @length
END
RETURN 0
GO
CREATE PROCEDURE TempReleaseStateItemExclusive
@id tSessionId,
@lockCookie INT
AS
UPDATE tempdb..ASPStateTempSessions
SET Expires = DATEADD(n, Timeout, GETDATE()),
Locked = 0
WHERE SessionId = @id AND LockCookie = @lockCookie
RETURN 0
GO
CREATE PROCEDURE TempInsertStateItemShort
@id tSessionId,
@itemShort tSessionItemShort,
@timeout INT
AS
DECLARE @now as DATETIME
SET @now = GETDATE()
INSERT tempdb..ASPStateTempSessions
(SessionId,
SessionItemShort,
Timeout,
Expires,
Locked,
LockDate,
LockCookie)
VALUES
(@id,
@itemShort,
@timeout,
DATEADD(n, @timeout, @now),
0,
@now,
1)
RETURN 0
GO
CREATE PROCEDURE TempInsertStateItemLong
@id tSessionId,
@itemLong tSessionItemLong,
@timeout INT
AS
DECLARE @now as DATETIME
SET @now = GETDATE()
INSERT tempdb..ASPStateTempSessions
(SessionId,
SessionItemLong,
Timeout,
Expires,
Locked,
LockDate,
LockCookie)
VALUES
(@id,
@itemLong,
@timeout,
DATEADD(n, @timeout, @now),
0,
@now,
1)
RETURN 0
GO
CREATE PROCEDURE TempUpdateStateItemShort
@id tSessionId,
@itemShort tSessionItemShort,
@timeout INT,
@lockCookie INT
AS
UPDATE tempdb..ASPStateTempSessions
SET Expires = DATEADD(n, Timeout, GETDATE()),
SessionItemShort = @itemShort,
Timeout = @timeout,
Locked = 0
WHERE SessionId = @id AND LockCookie = @lockCookie
RETURN 0
GO
CREATE PROCEDURE TempUpdateStateItemShortNullLong
@id tSessionId,
@itemShort tSessionItemShort,
@timeout INT,
@lockCookie INT
AS
UPDATE tempdb..ASPStateTempSessions
SET Expires = DATEADD(n, Timeout, GETDATE()),
SessionItemShort = @itemShort,
SessionItemLong = NULL,
Timeout = @timeout,
Locked = 0
WHERE SessionId = @id AND LockCookie = @lockCookie
RETURN 0
GO
CREATE PROCEDURE TempUpdateStateItemLong
@id tSessionId,
@itemLong tSessionItemLong,
@timeout INT,
@lockCookie INT
AS
UPDATE tempdb..ASPStateTempSessions
SET Expires = DATEADD(n, Timeout, GETDATE()),
SessionItemLong = @itemLong,
Timeout = @timeout,
Locked = 0
WHERE SessionId = @id AND LockCookie = @lockCookie
RETURN 0
GO
CREATE PROCEDURE TempUpdateStateItemLongNullShort
@id tSessionId,
@itemLong tSessionItemLong,
@timeout INT,
@lockCookie INT
AS
UPDATE tempdb..ASPStateTempSessions
SET Expires = DATEADD(n, Timeout, GETDATE()),
SessionItemLong = @itemLong,
SessionItemShort = NULL,
Timeout = @timeout,
Locked = 0
WHERE SessionId = @id AND LockCookie = @lockCookie
RETURN 0
GO
CREATE PROCEDURE TempRemoveStateItem
@id tSessionId,
@lockCookie INT
AS
DELETE tempdb..ASPStateTempSessions
WHERE SessionId = @id AND LockCookie = @lockCookie
RETURN 0
GO
CREATE PROCEDURE TempResetTimeout
@id tSessionId
AS
UPDATE tempdb..ASPStateTempSessions
SET Expires = DATEADD(n, Timeout, GETDATE())
WHERE SessionId = @id
RETURN 0
GO
CREATE PROCEDURE DeleteExpiredSessions
AS
DECLARE @now DATETIME
SET @now = GETDATE()
DELETE tempdb..ASPStateTempSessions
WHERE Expires < @now
RETURN 0
GO
EXECUTE CreateTempTables
GO
/* Create the startup procedure */
USE master
GO
CREATE PROCEDURE ASPState_Startup
AS
EXECUTE ASPState..CreateTempTables
RETURN 0
GO
EXECUTE sp_procoption @procname='ASPState_Startup', @optionname='startup', @optionvalue='true'
/* Create the job to delete expired sessions */
BEGIN TRANSACTION
DECLARE @JobID BINARY(16)
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
-- Add job category
IF (SELECT COUNT(*) FROM msdb.dbo.syscategories WHERE name = N'[Uncategorized (Local)]') < 1
EXECUTE msdb.dbo.sp_add_category @name = N'[Uncategorized (Local)]'
-- Add the job
EXECUTE @ReturnCode = msdb.dbo.sp_add_job
@job_id = @JobID OUTPUT,
@job_name = N'ASPState_Job_DeleteExpiredSessions',
@owner_login_name = NULL,
@description = N'Deletes expired sessions from the session state database.',
@category_name = N'[Uncategorized (Local)]',
@enabled = 1,
@notify_level_email = 0,
@notify_level_page = 0,
@notify_level_netsend = 0,
@notify_level_eventlog = 0,
@delete_level= 0
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
-- Add the job steps
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep
@job_id = @JobID,
@step_id = 1,
@step_name = N'ASPState_JobStep_DeleteExpiredSessions',
@command = N'EXECUTE DeleteExpiredSessions',
@database_name = N'ASPState',
@server = N'',
@database_user_name = N'',
@subsystem = N'TSQL',
@cmdexec_success_code = 0,
@flags = 0,
@retry_attempts = 0,
@retry_interval = 1,
@output_file_name = N'',
@on_success_step_id = 0,
@on_success_action = 1,
@on_fail_step_id = 0,
@on_fail_action = 2
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_update_job @job_id = @JobID, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
-- Add the job schedules
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobschedule
@job_id = @JobID,
@name = N'ASPState_JobSchedule_DeleteExpiredSessions',
@enabled = 1,
@freq_type = 4,
@active_start_date = 20001016,
@active_start_time = 0,
@freq_interval = 1,
@freq_subday_type = 4,
@freq_subday_interval = 1,
@freq_relative_interval = 0,
@freq_recurrence_factor = 0,
@active_end_date = 99991231,
@active_end_time = 235959
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
-- Add the Target Servers
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @JobID, @server_name = N'(local)'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:
GO
• | 更改 ASP.NET 工作进程标识。 |
• | 指定一个模拟标识。 |
• | 指定一个用于会话状态的连接字符串。 |
• | <identity userName= password= /> |
• | <processModel userName= password= /> |
• | <sessionState stateConnectionString= sqlConnectionString= /> |
简介
使用 Aspnet_setreg.exe 实用工具将这些属性值加密并存储到注册表中一个安全的项下。使用带 CRYPTPROTECT_LOCAL_MACHINE 标志的 CryptProtectData 函数加密凭据。由于任何人只要具有访问此计算机的权限就可以调用 CryptUnprotectData,因此,加密的数据被存储在一个安全的、具有严格自由访问控制列表 (DACL) 的注册表项下面。当 ASP.NET 分析配置文件时,它将读取此安全的注册表项,然后使用 CryptUnprotectData 来解密数据。在 System 标识下运行的 Inetinfo.exe 读取 <processModel /> 部分。要读取存储 ASP.NET 辅助进程用户名和密码的注册表项,System 帐户必须具有对这些项的“读取”权限。
ASP.NET 辅助进程 (Aspnet_wp.exe) 读取 <identity /> 和 <sessionState /> 部分。要读取这些注册表项,辅助进程帐户必须具有对这些项的“读取”权限。如果内容存放在“通用命名约定”(UNC) 共享上,则用于访问 UNC 共享的帐户必须具有对这些项的读取权限。
默认情况下,Aspnet_setreg.exe 创建的注册表项向 System、Administrator 和 Creator Owner 帐户授予完全控制权。您可以使用 Regedt32.exe 修改注册表项上的 DACL。应确保任意用户不能读取注册表项。
重新启动 IIS
要使您所做的更改生效,必须重新启动 Microsoft Internet 信息服务 (IIS)。重新启动 IIS 时,会启动一个新的 ASP.NET 工作进程。要重新启动 IIS,请单击“开始”,单击“运行”,在“打开”框中键入 iisreset,然后单击“确定”。注意:如果重新配置的服务器是域控制器,则可能必须重新启动该服务器。
更多信息
下载和运行 Aspnet_setreg.exe
可以从 Microsoft 下载中心下载以下文件:
发布日期:2003 年 4 月 11 日
有关如何下载 Microsoft 支持文件的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
要显示所有可用的命令行参数及其用法,请在命令提示符下不使用任何命令行参数运行此工具。如果已将此工具保存在 C:/Tools/ 中,请从命令提示符处运行以下命令,以显示该工具的所有可用开关及有关这些开关的帮助:
在配置文件中使用加密的属性
警告:如果使用注册表编辑器或其他方法错误地修改了注册表,则可能导致严重问题。这些问题可能需要重新安装操作系统才能解决。Microsoft 不能保证您可以解决这些问题。修改注册表需要您自担风险。注意:该工具在 HKEY_LOCAL_MACHINE 子树下创建注册表项。默认情况下,只有管理员才能在此子树下创建项。确保您以管理员的身份登录,以便成功创建这些注册表项。
1. | 加密将与 <identity> 部分一起使用的 userName 和 password 属性。(您也可以将此操作过程用于本文中提及的其他部分。)为此,请在命令行上键入以下命令:
c:/Tools>aspnet_setreg.exe -k:SOFTWARE/MY_SECURE_APP/identity -u:"yourdomainname/username" -p:"password"
该命令加密 userName 和 password 属性,并在指定的任何位置创建注册表项,然后将这些属性存储在那些注册表项中。此命令还可以生成输出内容,此内容指定如何更改您的 Web.config 或 Machine.config 文件,以便 ASP.NET 使用这些项从注册表中读取信息。执行此命令之后,您将收到类似于下面的输出内容: |
2. | 请修改相应的配置文件使之指向这些注册表项。如果必须在 <identity> 节中使用这些值,则得到的 <identity> 节将类似如下内容。
|
3. | 向 Aspnet_wp.exe 进程帐户授予“读取”权限。有关如何更改注册表项权限的更多信息,请参见“使用 Regedt32.exe 在这些注册表项中为 ASP.NET 帐户授予权限”一节。 |
使用 Regedt32.exe 在这些注册表项中为 ASP.NET 帐户授予权限
警告:如果使用注册表编辑器或其他方法错误地修改了注册表,则可能导致严重问题。这些问题可能需要重新安装操作系统才能解决。Microsoft 不能保证您可以解决这些问题。修改注册表需要您自担风险。1. | 单击“开始”,单击“运行”,在“打开”框中键入 regedt32,然后单击“确定”。 |
2. | 单击 HKEY_LOCAL_MACHINE/SOFTWARE/MY_SECURE_APP/ 子项。 |
3. | 在“安全性”菜单上,单击“权限”,以打开“权限”对话框。 在 Microsoft Windows XP 或 Windows Server 2003 上,右键单击该注册表项,然后单击“权限”。 |
4. | 单击“添加”。在打开的对话框中,键入 yourservername/ASPNET(如果使用 Windows Server 2003 (IIS 6.0),则键入 yourservername/NetWork Service),然后单击“确定”。 |
5. | 确保刚才添加的帐户具有“读取”权限,然后单击“确定”。 |
6. | 关闭注册表编辑器。 |